What I want to do: have an asyncio event loop that gets spun up that loop is passed to various classes in my system for scheduling coroutines on that loop is also used for handling the responses to events (ie, I have a Queue, some event handling code will place an item on that queue, and separate co-routines that await a get() on that queue to handle those values) there is a main thread which "owns" the loop and is responsible for creating the loop, and at time of system shutdown will cancel any running tasks on the loop and close & stop the loop (cleanly shutdown) My understanding is because of #3, something needs to call run_forever() on the loop to ensure that tasks get scheduled on the loop. But if I call run_forever() then my main thread blocks, never to terminate. What I've tried: Spawn a thread, passing in the loop, and then call run_forever in the thread. This means though that my unit tests never finish. The gist: def __start_background_loop(loop): def run_forever(loop): loop.run_forever() # because run_forever() will block the current thread, we spawn # a subthread to issue that call in. thread = Thread(target=run_forever, args=(loop,)) thread.start() def __end_background_loop(loop): for task in Task.all_tasks(loop): task.cancel() loop.stop() Continue reading...