我有一个使用此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?
答案 0 :(得分:0)
您还没有发布完整的示例,因此很难确定发生了什么。
但是,我发现您的循环中有try
块,而您的网络代码位于try
块内。我不知道你的异常处理是做什么的。但是,我猜它会像无意中吞下一个重要的错误。然后你的循环再次运行,可能会产生相同的错误。通过这种方式,即使您认为它处于睡眠状态,I / O也会阻塞,程序实际上正忙着循环。