You can retrieve unfinished tasks and run the loop again until they finished, then close the loop or exit your program.
pending = asyncio.all_tasks()
loop.run_until_complete(asyncio.gather(*pending))
pending
is a list of pending tasks.asyncio.gather()
allows to wait on several tasks at once.
If you want to ensure all the tasks are completed inside a coroutine (maybe you have a “main” coroutine), you can do it this way, for instance:
async def do_something_periodically():
while True:
asyncio.create_task(my_expensive_operation())
await asyncio.sleep(my_interval)
if shutdown_flag_is_set:
print("Shutting down")
break
await asyncio.gather(*asyncio.all_tasks())
Also, in this case, since all the tasks are created in the same coroutine, you already have access to the tasks:
async def do_something_periodically():
tasks = []
while True:
tasks.append(asyncio.create_task(my_expensive_operation()))
await asyncio.sleep(my_interval)
if shutdown_flag_is_set:
print("Shutting down")
break
await asyncio.gather(*tasks)