Run things concurrently

Run things concurrently#

Trigger execution of many coroutines/tasks simultaneously

results = await asyncio.gather(
    friendly_wait_for(.5),
    friendly_wait_for(1),
    friendly_wait_for(1.5),
)
print(results)
Done waiting for 0.5 seconds.
Done waiting for 1 seconds.
Done waiting for 1.5 seconds.
[0.5, 1, 1.5]

Work with results as they come in …

for coro in asyncio.as_completed(
    [
        friendly_wait_for(2.5),
        friendly_wait_for(1),
        friendly_wait_for(0.5),
    ]
):
    result = await coro
    print(result)
Done waiting for 0.5 seconds.
0.5
Done waiting for 1 seconds.
1
Done waiting for 2.5 seconds.
2.5

Use tasks instead of coroutines. Note that as_completed always returns the wrapped coroutine.

for coro in asyncio.as_completed(
    [
        asyncio.create_task(friendly_wait_for(2.5)),
        asyncio.create_task(friendly_wait_for(1)),
        asyncio.create_task(friendly_wait_for(0.5)),
    ]
):
    result = await coro
    print(result)
Done waiting for 0.5 seconds.
0.5
Done waiting for 1 seconds.
1
Done waiting for 2.5 seconds.
2.5