Asyncio.gather Vs Asyncio.wait


Answer :

Although similar in general cases ("run and get results for many tasks"), each function has some specific functionality for other cases:

asyncio.gather()

Returns a Future instance, allowing high level grouping of tasks:

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) 

All tasks in a group can be cancelled by calling group2.cancel() or even all_groups.cancel(). See also .gather(..., return_exceptions=True),

asyncio.wait()

Supports waiting to be stopped after the first task is done, or after a specified timeout, allowing lower level precision of operations:

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() 

asyncio.wait is more low level than asyncio.gather.

As the name suggests, asyncio.gather mainly focuses on gathering the results. It waits on a bunch of futures and returns their results in a given order.

asyncio.wait just waits on the futures. And instead of giving you the results directly, it gives done and pending tasks. You have to manually collect the values.

Moreover, you could specify to wait for all futures to finish or just the first one with wait.


I also noticed that you can provide a group of coroutines in wait() by simply specifying the list:

result=loop.run_until_complete(asyncio.wait([         say('first hello', 2),         say('second hello', 1),         say('third hello', 4)     ])) 

Whereas grouping in gather() is done by just specifying multiple coroutines:

result=loop.run_until_complete(asyncio.gather(         say('first hello', 2),         say('second hello', 1),         say('third hello', 4)     )) 

Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?