![](/img/trans.png)
[英]Using gevent.queue.Queue.get(): gevent.hub.LoopExit: 'This operation would block forever'
[英]gevent queue failed with LoopExit
我想使用python gevent库来实现一个生产者和多个消费者服务器。 我有尝试:
class EmailValidationServer():
def __init__(self):
self.queue = Queue()
def worker(self):
while True:
json = self.queue.get()
def handler(self,socket,address):
fileobj = socket.makefile()
content = fileobj.read(max_read)
contents = json.loads(content)
for content in contents:
self.queue.put(content)
def daemon(self,addr='127.0.0.1',num_thread=5):
pool = Pool(1000)
server = StreamServer((addr, 6000),self.handler,spawn=pool) # run
pool = ThreadPool(num_thread)
for _ in range(num_thread):
pool.spawn(self.worker)
server.serve_forever()
if __name__ == "__main__":
email_server = EmailValidationServer()
email_server.daemon()
我使用了来自gevent.queue.Queue的队列。 它给我错误信息:
LoopExit: This operation would block forever
(<ThreadPool at 0x7f08c80eef50 0/4/5>,
<bound method EmailValidationServer.worker of <__main__.EmailValidationServer instance at 0x7f08c8dcd998>>) failed with LoopExit
问题:但是,当我将队列从gevent的实现更改为python内置库时,它可以工作。 我不知道原因,我想支持在它们的实现之间有所区别。 我不知道gevent不允许无限等待的原因。 有没有人可以解释? 谢谢前进
我建议您可以使用gevent.queue.JoinableQueue()
代替Python的内置Queue()
。 您可以参考API使用的官方队列指南( http://www.gevent.org/gevent.queue.html )
def worker():
while True:
item = q.get()
try:
do_work(item)
finally:
q.task_done()
q = JoinableQueue()
for i in range(num_worker_threads):
gevent.spawn(worker)
for item in source():
q.put(item)
q.join() # block until all tasks are done
如果再次遇到异常,则最好完全理解Gevent例程控制流的原理。。。一旦掌握了要点,那就没什么大不了的了。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.