Python Gevent队列CPU使用率高
为什么此代码永久使用95%的CPU?生产者不发送任何请求,但cpu是热的。如何降低cpu使用率而不在consumer greenlet中添加显式非零睡眠超时Python Gevent队列CPU使用率高,python,queue,gevent,Python,Queue,Gevent,为什么此代码永久使用95%的CPU?生产者不发送任何请求,但cpu是热的。如何降低cpu使用率而不在consumer greenlet中添加显式非零睡眠超时 from gevent import queue from gevent import sleep from gevent import Greenlet def cons(q): while True: try: data = q.get_nowait() except q
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()
在第8行中,使用get()而不是get_nowait()
超级简单,现在您的消费者将在等待更多工作时阻塞。在第8行中,使用get()而不是get_nowait()
超级简单,现在您的消费者将在等待更多工作时阻塞。推荐的最佳解决方案: 使用queue.get在每个队列的单独greenlet中阻塞调用 代码的下一部分轮询两个gevent.queue队列+zmq.green socket ingreenlet ingreenlet ingreenlet=) CPU负载接近于零
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()
谢谢你的建议 所有建议的最佳解决方案: 使用queue.get在每个队列的单独greenlet中阻塞调用 代码的下一部分轮询两个gevent.queue队列+zmq.green socket ingreenlet ingreenlet ingreenlet=) CPU负载接近于零
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()
谢谢你的建议 如果我有多个队列(例如,控制和数据通道),这是一个好的解决方案,但这是一个坏的解决方案。我只是简单地添加了睡眠(0.00001)作为解决方法-CPU负载为3%,而不是96。@echo12345不要使用
睡眠!get
方法有一个timeout
参数:q.get(timeout=0.001)
。我很确定您不应该使用get\u nowait()或timeout参数。如果您阅读了多个队列,则只需制作多个绿色小册子。与线程不同,greenlet的创建和拆卸成本很低(数量可能很大)。如果我有多个队列(例如,控制和数据通道),这是一个不错的解决方案,但这是一个糟糕的解决方案。我只是简单地添加了睡眠(0.00001)作为解决方法-CPU负载为3%,而不是96。@echo12345不要使用睡眠!get
方法有一个timeout
参数:q.get(timeout=0.001)
。我很确定您不应该使用get\u nowait()或timeout参数。如果您阅读了多个队列,则只需制作多个绿色小册子。与线程不同,greenlet的创建和拆卸成本很低(数量可能很大)。