Что произойдет, если исключения не будут обнаружены в гринлете, определенном в пуле?

Я хочу знать, что происходит, исключения не перехватываются в порождении 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 просто проглотит их (что, мягко говоря, раздражает).

Другие вопросы по тегам