Mặc dù tương tự trong các trường hợp chung ("chạy và nhận kết quả cho nhiều tác vụ"), mỗi chức năng có một số chức năng cụ thể cho các trường hợp khác:
Trả về một phiên bản Tương lai, cho phép nhóm các tác vụ ở mức cao:
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)
Tất cả các nhiệm vụ trong một nhóm có thể bị hủy bằng cách gọi group2.cancel()
hoặc thậm chí all_groups.cancel()
. Xem thêm .gather(..., return_exceptions=True)
,
Các hỗ trợ chờ được dừng sau khi hoàn thành nhiệm vụ đầu tiên hoặc sau khi hết thời gian chỉ định, cho phép các hoạt động ở mức độ chính xác thấp hơn:
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()