检测Python中的网络是否空闲

时间:2013-08-01 00:34:58

标签: python networking

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

在这方面应该可以做两件事:

  1. 检测到网络空闲时继续下载。
  2. 检测到某些网络活动时暂停下载。
  3. 定义'idle-ness'的一种方法是在网络活动达到最大带宽的1%连续5分钟时触发。

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

2 个答案:

答案 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。是的,它会慢一些,但实现起来会容易得多,而且更容易理解它是如何工作的。