跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 各位大佬,小弟使用 gevent 遇到了 loopexit 的错误
未分類
25 11 月 2020

各位大佬,小弟使用 gevent 遇到了 loopexit 的错误

各位大佬,小弟使用 gevent 遇到了 loopexit 的错误

資深大佬 : xiangyuhahah 4

我这边遇到一个问题,使用 gevent 的时候,报了 loopexit 的错误。

import random from Queue import Empty import gevent from gevent.queue import *  import gevent.monkey gevent.monkey.patch_all()   q = Queue() workers = []   def do_work(wid, value):     gevent.sleep(random.randint(0,2))     print 'Task', value, 'done', wid     return   def worker(wid):     while True:         try:             item = q.get()             if item:                 do_work(wid, item)         except StopIteration:             break         except Empty:             break   def producer():     for i in range(4):         workers.append(gevent.spawn(worker, random.randint(1, 888888)))      for item in range(1, 9):         q.put(item)   producer() gevent.joinall(workers) 

我查了网上的资料,看了 gevent 的原理,但是没怎么看明白。网上主流的解释是任务流已经消费完了,协程都在做 waiter 的操作,导致 gevent 的 joinall 失败了。我没有理解这个过程。现在的我的解决办法是,消费完任务之后协程会报空的错误,捕捉一下就退出协程。但是我感觉这样只是掩盖了问题,没有解决问题。

item = q.get() >>item = q.get(block=False) 

各位大佬怎么理解 loopexit ?

大佬有話說 (2)

  • 資深大佬 : cz5424

    感觉是 Queue(),如果想要多线程多进程和协程,一般会避免全局变量

  • 資深大佬 : catxo

    你的 worker 是一个循环,没有退出条件
    一般都是判断 item 为空作为退出条件
    “`python
    item = q.get()
    if not item:
    break
    do_work(wid, item)
    “`

    producer 里面,加上
    “`python
    for _ in range(4):
    q.put(None)
    “`

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具