温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Call asyncio Future in scope
asynchronous python python-3.6 python-asyncio

python - 在范围内调用asyncio Future

发布于 2020-03-27 12:01:23

我正在尝试使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。

我在这里想念什么吗?

查看更多

查看更多

提问者
RobinFrcd
被浏览
96
user4815162342 2019-07-05 04:47

ASYNCIO期货由归国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。