2016-04-09 3 views
6

У меня есть программа, которая использует этот library в основном делает что-то очень простое, как этотПрограмма python, которая блокирует 6% процессора?

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

        data = receiver.read(1024) 

Приемник гнездовых блоков, пока данные не приходит, поэтому print 'Spinning' только печатает один раз, пока данные не будут получены на сокете. Когда я спрашиваю ОС, сколько CPU этот процесс берет, даже если он ждет от приема, он возвращается с:

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

В самом деле, если я запускаю некоторые из этих процессов, мой компьютер с двумя CPU и 8 ядер каждый, все ядра идут на 100% использования, и компьютер становится непригодным.

Я должен неправильно понимать понятие «блокирование» python, потому что даже ничего не делать, что в принципе должно спать, занимает много процессора.

Есть ли более правильный способ написать это, чтобы программы, которые в основном ждут ввода/вывода [прерывания, управляются], отказываются от процессора?

+0

FWIW, я просто закодировал очень похожую программу в голанге, и использование ЦП будет таким, как ожидалось, когда никакие данные не войдут в процессы, почти равны нулю. – Ivan

+0

Я должен добавить, что я «скомпилировал» код go. Я начинаю полагать, что большая часть из них - накладные расходы интерпретатора python. – Ivan

+0

Я полагаюсь на Go больше каждый день, а Python меньше, так как так удобно писать оптимизированный код в Go. – user161778

ответ

0

Вы не опубликовали полный пример, поэтому трудно точно сказать, что происходит.

Однако я вижу, что внутри вашей петли есть блок try, а ваш сетевой код находится внутри блока try. Я не знаю, что делает ваша обработка исключений. Тем не менее, я предполагаю, что это делает что-то вроде непреднамеренного проглатывания важной ошибки. Затем ваш цикл снова запускается и, вероятно, генерирует ту же ошибку. Таким образом, программа фактически занята циклом, даже если вы думали, что она спит, блокируя ввод-вывод.

Смежные вопросы