我正在制作一个基于Python的下载器。目前,我已经有了一个能够工作的基于多进程的控制台脚本。我想知道如何检测网络是否处于空闲状态。也就是说,用户没有使用网络(浏览、冲浪等)。
在这方面,它应该能够完成两件事:
- 检测到网络空闲时恢复下载。
- 检测到某些网络活动时暂停下载。
定义“空闲”的一种方式可能是在连续5分钟内,如果网络活动处于最大带宽的1%左右,则触发。
是否有更好的方法来检测网络是否空闲?
在这方面,它应该能够完成两件事:
定义“空闲”的一种方式可能是在连续5分钟内,如果网络活动处于最大带宽的1%左右,则触发。
是否有更好的方法来检测网络是否空闲?
psutil.network_io_counters
模块: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的速度下载。是的,它会慢一些,但实现起来会更容易,并且更容易理解其工作原理。
ifconfig eth0
可以给出接收和发送的字节数,如果定期运行,可以得到一个简单的指标。我会在 pexpect(或类似工具)中包装该命令并检查输出。不过,我也很想知道一个更好的方法来实现这个功能。 - Verma