asynchronous – Making async for loops in Python
asynchronous – Making async for loops in Python
Looking at the desired output, it seems that the goal is to leave the individual iteration as it is – i.e. run first
and second
sequentially – but execute both loop iterations in parallel.
Assuming you only want to modify main()
, it could be achieved like this:
async def main():
async def one_iteration():
result = await first()
print(result)
result2 = await second()
print(result2)
coros = [one_iteration() for _ in range(2)]
await asyncio.gather(*coros)
Instead of iterating in sequence, the above creates a coroutine for each iteration task, and uses asyncio.gather
to execute all the iterations in parallel.
Note that simply creating a coroutine doesnt start executing it, so a large number of coros
wont block the event loop.
With the aysncio library you can use aysncio.gather()
loop.run_until_complete(asyncio.gather(
first(),
second()
))
This can come in handy if you are also sending HTTP requests in parallel:
loop.run_until_complete(asyncio.gather(
request1(),
request2()
))
asynchronous – Making async for loops in Python
To run the two functions simultaneously you can use gather
. However, the results will be provided to you in the order you provide them. So for example if you do
results = await asyncio.gather(first(), second())
Then you will get [the result of first(), the result of second()]
back. If you want to do something whenever each one returns then you should use Tasks
explicitly and add callbacks.