我正在努力使我的asyncIO Futures更加成熟。由于某些原因,我无法在任何其他范围内获得价值更新。
例如:
import concurrent.futures
import time
import asyncio
import random
def get_progress(futures):
return sum([f.done() for f in futures])
def long_task(t):
time.sleep(1.5)
return t
loop = asyncio.get_event_loop()
executor = concurrent.futures.ProcessPoolExecutor(max_workers=4)
inputs = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
futures_ = [loop.run_in_executor(executor, long_task, i) for i in inputs]
for i in range(5):
time.sleep(1)
print(get_progress(futures_))
仅打印0
。但是,如果我在终端中运行此程序并调用get_progress(futures_)
,则会按预期输出7。
我在这里想念东西吗?
答案 0 :(得分:1)
run_in_executor
旨在在asyncio事件循环中运行,并且与concurrent ones不同。正确的异步代码如下所示:
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。