我正在制作一个基于 Python 的下载器。到目前为止,我有一个基于多处理的控制台脚本。我想知道如何检测网络是否空闲。也就是说,用户自己不使用网络(浏览、冲浪等)。
在这方面它应该能够做两件事:
- 当检测到网络空闲时继续下载。
- 当它检测到某些网络活动时暂停下载。
定义“空闲”的一种方法可能是在网络活动连续 5 分钟处于最大带宽的 1% 时触发。
有没有更好的方法来检测网络是否空闲?
我正在制作一个基于 Python 的下载器。到目前为止,我有一个基于多处理的控制台脚本。我想知道如何检测网络是否空闲。也就是说,用户自己不使用网络(浏览、冲浪等)。
在这方面它应该能够做两件事:
定义“空闲”的一种方法可能是在网络活动连续 5 分钟处于最大带宽的 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)
}
您可以跟踪要监视的接口上发送和接收的字节,这将为您提供网络空闲或忙碌的信息。
我有点想知道这是否是正确的方法。您将不得不在一段时间内进行平均并经常检查,并且您仍然会遇到 TOCTTOU问题(也就是说,就在您决定开始下一个下载段的同时,用户点击了启动网络活动的东西)。
更好的方法实际上可能是简单地限制(到用户可配置的级别?)应用程序的下载带宽,因此它仅以 X KB/s 的速度下载。是的,它会慢一点,但它会更容易实现,也更容易理解它是如何工作的。