簡體   English   中英

gevent隊列因LoopExit失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM