Что произойдет, если исключения не будут обнаружены в гринлете, определенном в пуле?
Я хочу знать, что происходит, исключения не перехватываются в порождении greenlet в gevent.pool. Разве он не обновляет семафор и не делает его доступным, чтобы мог появиться новый гринлет?
Я просто хочу убедиться, что если пул имеет размер 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()
1 ответ
Вот пример
from gevent.pool import Pool
def work():
raise Exception("Vzboom!")
pool = Pool(2)
greenlet = pool.spawn(work)
greenlet.run()
print(greenlet.exception) # => Exception: Vzboom!
Он не блокируется, и вы всегда можете проверить, есть ли исключение, как видно (аналогично
threading.ThreadPoolExecutor
с фьючерсами).
Большая разница в том, что исключение будет отображаться здесь прямо на экране, в то время как пул потоков доставки Python просто проглотит их (что, мягко говоря, раздражает).