块占用6%CPU的python程序?

时间:2016-04-09 16:37:50

标签: python performance sockets process blocking

我有一个使用此library的程序基本上做了一些非常简单的事情,比如这个

   receiver = multicast.MulticastUDPReceiver ("192.168.0.2", symbolMCIPAddrStr, symbolMCPort )
   while True:
            print 'Spinning'
            try:
                    b = MD()

                    data = receiver.read(1024)

接收器套接字阻塞,直到数据进入,因此print 'Spinning'仅打印一次,直到套接字上收到数据。当我向操作系统询问这个过程占用了多少CPU时,即使它正在等待接收,它也会回来:

[idf@node1 ~]$ ps -p  4294 -o %cpu,%mem,cmd
%CPU %MEM CMD
 6.3  0.4 python ./mc.py -s EUR/USD
[idf@node1 ~]$

事实上,如果我运行其中几个进程,我的计算机每个都有两个CPU和8个核心,所有核心的使用率都达到100%,计算机也无法使用。

我必须误解python"阻止"的概念。因为即使是一个基本上不应该睡觉的无所事事的过程占用了大量的CPU。

有没有更正确的方法来编写它,以便基本上等待I / O [中断驱动]的程序放弃CPU?

1 个答案:

答案 0 :(得分:0)

您还没有发布完整的示例,因此很难确定发生了什么。

但是,我发现您的循环中有try块,而您的网络代码位于try块内。我不知道你的异常处理是做什么的。但是,我猜它会像无意中吞下一个重要的错误。然后你的循环再次运行,可能会产生相同的错误。通过这种方式,即使您认为它处于睡眠状态,I / O也会阻塞,程序实际上正忙着循环。