尽管在一般情况下类似(“为许多任务运行并获取结果”),但是对于其他情况,每个功能都有一些特定的功能:
[asyncio.gather()
](https://docs.python.org/3/library/asyncio-
task.html#asyncio.gather)
返回一个Future实例,允许高层任务分组:
import asynciofrom pprint import pprintimport randomasync def coro(tag): print(">", tag) await asyncio.sleep(random.uniform(1, 3)) print("<", tag) return tagloop = 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()
](https://docs.python.org/3/library/asyncio-
task.html#asyncio.wait)
支持在第一个任务完成后或在指定的超时后等待停止,从而降低了操作的精度:
import asyncioimport randomasync def coro(tag): print(">", tag) await asyncio.sleep(random.uniform(0.5, 5)) print("<", tag) return tagloop = 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()


