3

我正在制作一个基于 Python 的下载器。到目前为止,我有一个基于多处理的控制台脚本。我想知道如何检测网络是否空闲。也就是说,用户自己不使用网络(浏览、冲浪等)。

在这方面它应该能够做两件事:

  1. 当检测到网络空闲时继续下载。
  2. 当它检测到某些网络活动时暂停下载。

定义“空闲”的一种方法可能是在网络活动连续 5 分钟处于最大带宽的 1% 时触发。

有没有更好的方法来检测网络是否空闲?

4

2 回答 2

1

我建议使用该psutil.network_io_counters模块:

将网络 I/O 统计信息作为命名元组返回,包括以下属性:

  • bytes_sent:发送的字节数
  • bytes_recv:接收到的字节数
  • packet_sent:发送的数据包数
  • packet_recv:收到的数据包数
  • errin:接收时的错误总数
  • 错误:发送时的错误总数
  • dropin:被丢弃的传入数据包总数
  • dropout:被丢弃的传出数据包总数(在 OSX 和 BSD 上始终为 0)

如果 pernic 为 True,则为系统上安装的每个网络接口返回相同的信息作为字典,其中网络接口名称作为键,上述命名元组作为值。

In [1]: import psutil
In [2]: psutil.network_io_counters(pernic=True)
Out[2]:
{'en0': iostat(bytes_sent=143391435L, bytes_recv=1541801914L,
               packets_sent=827983L, packets_recv=1234558L, errin=0L, errout=0L,
               dropin=0L, dropout=0),
 'gif0': iostat(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L,
                errin=0L, errout=0L, dropin=0L, dropout=0),
 'lo0': iostat(bytes_sent=6143860L, bytes_recv=6143860L, packets_sent=55671L,
               packets_recv=55671L, errin=0L, errout=0L, dropin=0L, dropout=0),
 'p2p0': iostat(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L,
                errin=0L, errout=0L, dropin=0L, dropout=0),
 'stf0': iostat(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L,
                errin=0L, errout=0L, dropin=0L, dropout=0)
}

您可以跟踪要监视的接口上发送和接收的字节,这将为您提供网络空闲或忙碌的信息。

于 2013-08-08T19:48:08.870 回答
1

我有点想知道这是否是正确的方法。您将不得不在一段时间内进行平均并经常检查,并且您仍然会遇到 TOCTTOU问题(也就是说,就在您决定开始下一个下载段的同时,用户点击了启动网络活动的东西)。

更好的方法实际上可能是简单地限制(到用户可配置的级别?)应用程序的下载带宽,因此它仅以 X KB/s 的速度下载。是的,它会慢一点,但它会更容易实现,也更容易理解它是如何工作的。

于 2013-08-14T13:16:38.770 回答