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.

Leave a Reply

Your email address will not be published. Required fields are marked *