gpt4 book ai didi

python - 在范围内调用 asyncio Future

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:06 24 4
gpt4 key购买 nike

我正在尝试获取我的 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。

我是不是漏掉了什么?

最佳答案

Asyncio futuresrun_in_executor 返回设计为在异步事件循环中运行并且不同于 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真正的并发 future ,futures_ 也包含它们。通过此修改,跟踪他们进度的原始 for 循环将正常工作并打印 0 4 4 7 7。

关于python - 在范围内调用 asyncio Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56873699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com