gpt4 book ai didi

python - Asyncio.gather 与 asyncio.wait

转载 作者:IT老高 更新时间:2023-10-28 21:08:14 38 4
gpt4 key购买 nike

asyncio.gatherasyncio.wait似乎有类似的用途:我有一堆我想要执行/等待的异步事情(不一定要在下一个开始之前等待一个完成)。它们使用不同的语法,并且在某些细节上有所不同,但对我来说,拥有两个在功能上具有如此巨大重叠的函数似乎非常不符合 Python 标准。我错过了什么?

最佳答案

虽然在一般情况下类似(“运行并获取许多任务的结果”),但每个函数都有一些针对其他情况的特定功能:

asyncio.gather()

返回一个 Future 实例,允许对任务进行高级分组:

import asyncio
from pprint import pprint

import random


async def coro(tag):
print(">", tag)
await asyncio.sleep(random.uniform(1, 3))
print("<", tag)
return tag


loop = asyncio.get_event_loop()

group1 = asyncio.gather(*[coro("group 1.{}".format(i)) for i in range(1, 6)])
group2 = asyncio.gather(*[coro("group 2.{}".format(i)) for i in range(1, 4)])
group3 = asyncio.gather(*[coro("group 3.{}".format(i)) for i in range(1, 10)])

all_groups = asyncio.gather(group1, group2, group3)

results = loop.run_until_complete(all_groups)

loop.close()

pprint(results)

可以通过调用group2.cancel() 甚至all_groups.cancel() 来取消组中的所有任务。另请参阅 .gather(..., return_exceptions=True),

asyncio.wait()

支持在第一个任务完成后或指定超时后等待停止,允许较低级别的操作精度:

import asyncio
import random


async def coro(tag):
print(">", tag)
await asyncio.sleep(random.uniform(0.5, 5))
print("<", tag)
return tag


loop = asyncio.get_event_loop()

tasks = [coro(i) for i in range(1, 11)]

print("Get first result:")
finished, unfinished = loop.run_until_complete(
asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED))

for task in finished:
print(task.result())
print("unfinished:", len(unfinished))

print("Get more results in 2 seconds:")
finished2, unfinished2 = loop.run_until_complete(
asyncio.wait(unfinished, timeout=2))

for task in finished2:
print(task.result())
print("unfinished2:", len(unfinished2))

print("Get all other results:")
finished3, unfinished3 = loop.run_until_complete(asyncio.wait(unfinished2))

for task in finished3:
print(task.result())

loop.close()

关于python - Asyncio.gather 与 asyncio.wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231161/

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