asyncio - how to stop background task cleanly

Frank Millman frank at chagford.com
Sat Feb 6 02:55:26 EST 2016


Hi all

It is easy enough to set up a task to run in the background every 10 seconds 
using asyncio -

    async def background_task():
        while True:
            await perform_task()
            await asyncio.sleep(10)

    asyncio.ensure_future(background_task())

When shutting the main program down, I want to stop the task, but I cannot 
figure out how to stop it cleanly - i.e. wait until it has finished the 
current task and possibly performed some cleanup, before continuing.

    async def background_task():
        await perform_setup()
        while condition:
            await perform_task()
            await asyncio.sleep(10)
        await perform_cleanup()

Previously I would run the task in another thread, then set a flag to tell 
it to stop, then join() the thread which would block until the task had 
finished. I used threading.Event as the flag, which allows it to 'sleep' 
using wait() with a timeout value, but reacts instantly when set() is 
called, so it was ideal.

Is there a way to achieve this using asyncio?

Thanks

Frank Millman




More information about the Python-list mailing list