Документация относительно времени ожидания для concurrent.futures
очень сложна для понимания. В простом случае я хотел бы использовать ProcessPoolExecutor
, вызывая .submit
в al oop, который просматривает список рабочих функций. Я хочу, чтобы каждый из этих Future
объектов имел связанный тайм-аут в 10 минут, но в противном случае он завершится асинхронно.
Мой первый подход состоял в том, чтобы попытаться использовать функцию as_completed
, которая создает итератор объектов Future и выдает следующий после завершения. as_completed
принимает параметр timeout
, но в документации сказано, что это время ожидания относится к первому моменту, когда вызывается as_completed
, и не обязательно к времени жизни любого объекта Future
.
Например, предположим, что ProcessPoolExecutor
имеет только 3 рабочих процесса, но список объектов Future
содержит 10 элементов. 7 из элементов могут находиться в необработанном состоянии до 10 минут, пока обрабатываются первые 3 элемента. Вскоре после этого тайм-аут от as_completed
будет отключен, что приведет к сбою, даже если каждый индивидуум Future
, возможно, сам достиг 10-минутного ограничения.
Обратите внимание, что те же ограничения, которые применяются для as_completed
также будет применяться для wait
, а wait
труднее использовать для этого варианта использования из-за ограниченных опций возврата, которые он поддерживает.
Моя следующая мысль заключалась в использовании timeout
параметр, который future.result
позволяет и вызов f.result(timeout=600)
для каждого f
(Future) в моем списке фьючерсов. Однако на самом деле нет способа установить этот тайм-аут, не требуя на самом деле блокирующего результата. Если вы перебираете список фьючерсов и вызываете f.result(...)
, этот вызов блокируется в течение указанного времени ожидания.
С другой стороны, вы также не можете комбинировать f.result
с as_completed
либо в наивном, но на первый взгляд правильный путь, такой как
[f.result(timeout=600) for f in as_completed(futures_list)]
... потому что итерация as_completed
обманчиво ожидает асинхронно по завершении фьючерса и возвращает только то, что .result
вызвано после того, как они уже завершено.
Исходя из этого, каков правильный шаблон для создания списка Future
с, каждый из которых имеет свой индивидуальный тайм-аут, а затем ожидает их асинхронно до окончания sh?