Asyncio futures , возвращаемое run_in_executor
, предназначено для запуска в цикле событий asyncio и отличается от одновременных . Правильный асинхронный код будет выглядеть так:
async def track_progress():
for i in range(5):
await asyncio.sleep(1)
print(get_progress(futures_))
loop.run_until_complete(track_progress())
Печатает 0 4 4 7 7.
Обратите внимание, что вам не нужно asyncio и run_in_executor
, если вы просто хотите запускать вещи в потоках - concurrent.futures
вполне способен справиться с этим самостоятельно. Например:
executor = concurrent.futures.ProcessPoolExecutor(max_workers=4)
inputs = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
futures_ = [executor.submit(long_task, i) for i in inputs]
Поскольку executor.submit
реальных параллельных фьючерсов, futures_
также содержит их. С этой модификацией ваш оригинальный цикл for
, который отслеживает их прогресс, будет работать нормально, а также печатать 0 4 4 7 7.