我想知道如果gevent.pool中的greenlet生成中没有捕获到异常,会发生什么。它是否会更新信号量并使其可用,以便生成新的greenlet?
我只想确保,如果池的大小为10,并且我们有10个小绿,并且所有这些都抛出了一个未捕获的异常,那么就不能产生新的小绿。因为它们没有以正常的方式释放/终止,信号量计数也没有更新。
from gevent import pool
def test(index):
print(index)
raise
p = pool.Pool(size=5)
for i in range(10):
p.spawn(test, i)
p.join()
下面是一个示例
from gevent.pool import Pool
def work():
raise Exception("Vzboom!")
pool = Pool(2)
greenlet = pool.spawn(work)
greenlet.run()
print(greenlet.exception) # => Exception: Vzboom!
它不会阻塞,您可以随时检查是否存在异常(类似于带有futures的threading.ThreadPoolExecutor
(。
最大的区别是,异常将直接显示在屏幕上,而Python的发货线程池将吞噬它们(至少可以说这很烦人(。