【问题标题】:Call asyncio Future in scope在范围内调用 asyncio Future
【发布时间】:2019-07-03 15:39:36
【问题描述】:

我正试图让我的 asyncIO 期货进展。出于某种原因,我无法在任何其他范围内获取值更新。

例如:

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。

我在这里错过了什么吗?

【问题讨论】:

    标签: python asynchronous python-3.6 python-asyncio


    【解决方案1】:

    run_in_executor 返回的Asyncio futures 设计为在异步事件循环中运行,与concurrent ones 不同。正确的 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。

    【讨论】:

    • 感谢您提供这个清晰的示例。我不知道executor.submit,谢谢你的提示!
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多