首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当queue.get在greenlets中调用时(主游隙除外),gevent队列不会引发空?

当queue.get在greenlets中调用时(主游隙除外),gevent队列不会引发空?
EN

Stack Overflow用户
提问于 2021-03-28 09:37:04
回答 1查看 172关注 0票数 0

我对gevent非常陌生,我的问题甚至可能很天真,但是当我运行下面的代码时,会得到队列空异常。

案例1说得通

代码语言:javascript
复制
import gevent
from gevent import monkey
monkey.patch_all()

q = gevent.queue.Queue(maxsize=10)

try:
    q.get(timeout=1)
except gevent.queue.Empty:
    print("main greenlet queue empty")

但是,如果我运行以下代码,我就不会得到任何超时,而代码就是不会调用任何异常,也不会输入异常清除块,实际上代码甚至不需要等待1秒才能从队列中获取数据。我只是用显示的输出立即执行。

案例2

代码语言:javascript
复制
import gevent
from gevent import monkey
monkey.patch_all()

q = gevent.queue.Queue(maxsize=10)

def worker(idx):
    print("worker", idx)
    try:
        q.get(timeout=1)
    except gevent.queue.Empty:
        print("worker", idx, "queue empty")

workers = [gevent.spawn(worker, i) for i in range(1)]

这一产出如下:

代码语言:javascript
复制
worker 0

但是,如果我调用get在主绿中,并调用queue.get,就像下面这样,行为就会恢复正常。

案例3

代码语言:javascript
复制
import gevent
from gevent import monkey
monkey.patch_all()

q = gevent.queue.Queue(maxsize=10)

def worker(idx):
    print("worker", idx)
    try:
        q.get(timeout=1)
    except gevent.queue.Empty:
        print("worker", idx, "queue empty")

workers = [gevent.spawn(worker, i) for i in range(1)]

try:
    q.get(timeout=1)
except gevent.queue.Empty:
    print("main greenlet queue empty")

我得到了跟踪输出。

代码语言:javascript
复制
worker 0
main greenlet queue empty
worker 0 queue empty

我不明白为何第二种情况不例外,可否有人向我解释我做错了甚麽?

我使用python3.7和gevent '21.1.2‘

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-28 10:13:31

在第二种情况下,您将启动绿包(解释器随后退出)。添加joinall()使您的代码等待生成的绿地返回:

代码语言:javascript
复制
q = gevent.queue.Queue(maxsize=10)

def worker(idx):
    print("worker", idx)
    try:
        q.get(timeout=1)
    except gevent.queue.Empty:
        print("worker", idx, "queue empty")


print(q.empty())
workers = [gevent.spawn(worker, i) for i in range(1)]
# waiting for them to finish, works as expected!
gevent.joinall(workers)

退出:

代码语言:javascript
复制
True
worker 0
worker 0 queue empty
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66840043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档