我正在制作一个基于Python的下载程序。到目前为止,我有一个基于多处理的控制台脚本。我想知道如何检测网络是否空闲。也就是说,用户自己不使用网络(浏览,浏览等)。
在这方面应该可以做两件事:
定义'idle-ness'的一种方法是在网络活动达到最大带宽的1%连续5分钟时触发。
有没有更好的方法来检测网络是否空闲?
答案 0 :(得分:1)
我建议使用psutil.network_io_counters
模块:
将网络I / O统计信息作为namedtuple返回,包括以下内容 属性:
- bytes_sent:发送的字节数
- bytes_recv:接收的字节数
- packets_sent:发送的包数
- packets_recv:收到的数据包数
- errin:接收时的错误总数
- errout:发送时的错误总数
- dropin:丢弃的传入数据包总数
- dropout:丢弃的传出数据包总数 (在OSX和BSD上始终为0)
如果pernic为True,则返回每个网络的相同信息 接口安装在系统上作为带网络的字典 接口名称作为键和上面描述的namedtuple作为 值。
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)
}
您可以跟踪要监控的接口上的已发送和已接收字节,并在网络空闲或忙碌时为您提供信息。
答案 1 :(得分:1)
我有点想知道这是否是正确的方法。您将不得不平均一段时间并经常检查,并且您仍然会遇到TOCTTOU个问题(也就是说,就在您决定开始下一个下载段的同一时间,用户点击了启动的内容网络活动)。
更好的方法实际上可能是简单地限制(到用户可配置的级别?)应用程序的下载带宽,因此它只下载X KB / s。是的,它会慢一些,但实现起来会容易得多,而且更容易理解它是如何工作的。