2013-05-19 1 views
1

Почему этот код постоянно использует 95% процессора? Производитель не отправляет никаких запросов, но процессор горячий. Как снизить использование процессора, не добавляя явный ненулевой тайм-аут ожидания в зеленую розетку?Gevent queue высокая загрузка процессора

from gevent import queue 
from gevent import sleep 
from gevent import Greenlet 

def cons(q): 
    while True: 
     try: 
      data = q.get_nowait() 
     except queue.Empty: 
      sleep(0) 
      continue 
     print data 

def prod(q): 
    while True: 
     #q.put_nowait('hello') 
     sleep(1) 


if __name__ == '__main__': 

    q = queue.Queue() 
    cons1 = Greenlet.spawn(cons, q) 
    prod1 = Greenlet.spawn(prod, q) 
    cons1.join() 
    prod1.join() 

ответ

1

В строке 8, используйте получить() вместо get_nowait()

data = q.get() 

Супер простой, теперь ваш потребитель будет блокировать во время ожидания для дополнительной работы.

+1

Это хорошо, но это плохое решение, если у меня есть более одной очереди (например, каналы управления и передачи данных). Я просто добавил sleep (0.00001) в качестве обходного пути - загрузка процессора 3% вместо 96. – echo12345

+0

@ echo12345 Не используйте 'sleep'! Метод 'get' имеет параметр' timeout': 'q.get (timeout = 0.001)'. – Bakuriu

+1

Я уверен, что вы не должны использовать параметры get_nowait() или timeout. Если вы читаете несколько очередей, то просто создайте более одной зелени. В отличие от нитей, зелья дешевы для создания и удаления (в возможно больших количествах). –

0

Лучшее решение из всех рекомендуемых: Используйте queue.get, блокируя вызов внутри отдельных зеленых точек для каждой очереди.

Следующая часть кода проверяет две очереди gevent.queue + zmq.green сокет внутри зеленых грилей внутри greenlet =) Загрузка процессора близка к нулю!

def _zmq_poll(self): 
    while True: 
     sockets = super(Core, self)._zmq_poll() 
     if sockets: 
      if sockets.get(self.z_ctr) == zmq.POLLIN: 
       self.ctr_process() 

def ctr_process(self): 
    self.send_log('new CTR: %s') 

def req_process(self): 
    while True: 
     req = self.q_req_core.get() 
     self.send_log('new req: %s' % req) 
     self.q_core_wrk.put(req) 

def wrk_process(self): 
    while True: 
     wrk_result = self.q_wrk_core.get() 
     self.send_log('new result: %s' % wrk_result) 
     self.q_core_res.put(wrk_result) 
     self.test_wrk_result(wrk_result) 

def _run(self): 
    self.slaves_start() 
    req_process = Greenlet(self.req_process) 
    wrk_process = Greenlet(self.wrk_process) 
    zmq_poll = Greenlet(self._zmq_poll) 
    req_process.start() 
    wrk_process.start() 
    zmq_poll.start() 
    zmq_poll.join() 
    req_process.join() 
    wrk_process.join() 
    self._cleanup() 

Спасибо за советы!