我对gevent非常陌生,我的问题甚至可能很天真,但是当我运行下面的代码时,会得到队列空异常。
案例1说得通
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
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)]这一产出如下:
worker 0但是,如果我调用get在主绿中,并调用queue.get,就像下面这样,行为就会恢复正常。
案例3
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")我得到了跟踪输出。
worker 0
main greenlet queue empty
worker 0 queue empty我不明白为何第二种情况不例外,可否有人向我解释我做错了甚麽?
我使用python3.7和gevent '21.1.2‘
发布于 2021-03-28 10:13:31
在第二种情况下,您将启动绿包(解释器随后退出)。添加joinall()使您的代码等待生成的绿地返回:
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)退出:
True
worker 0
worker 0 queue emptyhttps://stackoverflow.com/questions/66840043
复制相似问题