Asked By – knite
Let’s say we have a dummy function:
async def foo(arg): result = await some_remote_call(arg) return result.upper()
What’s the difference between:
import asyncio coros =  for i in range(5): coros.append(foo(i)) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(coros))
import asyncio futures =  for i in range(5): futures.append(asyncio.ensure_future(foo(i))) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(futures))
Note: The example returns a result, but this isn’t the focus of the question. When return value matters, use
gather() instead of
Regardless of return value, I’m looking for clarity on
wait(futures) both run the coroutines, so when and why should a coroutine be wrapped in
Basically, what’s the Right Way ™ to run a bunch of non-blocking operations using Python 3.5’s
For extra credit, what if I want to batch the calls? For example, I need to call
some_remote_call(...) 1000 times, but I don’t want to crush the web server/database/etc with 1000 simultaneous connections. This is doable with a thread or process pool, but is there a way to do this with
2020 update (Python 3.7+): Don’t use these snippets. Instead use:
import asyncio async def do_something_async(): tasks =  for i in range(5): tasks.append(asyncio.create_task(foo(i))) await asyncio.gather(*tasks) def do_something(): asyncio.run(do_something_async)
Also consider using Trio, a robust 3rd party alternative to asyncio.
Now we will see solution for issue: Difference between coroutine and future/task in Python 3.5?
A comment by Vincent linked to https://github.com/python/asyncio/blob/master/asyncio/tasks.py#L346, which shows that
wait() wraps the coroutines in
ensure_future() for you!
In other words, we do need a future, and coroutines will be silently transformed into them.
I’ll update this answer when I find a definitive explanation of how to batch coroutines/futures.
This question is answered By – knite
This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0