I'm not sure what I'm doing wrong here, I'm trying to have a class which contains a queue and uses a coroutine to consume items on that queue. The wrinkle is that the event loop is being run in a separate thread (in that thread I do loop.run_forever() to get it running).
What I'm seeing though is that the coroutine for consuming items is never fired:
import asyncio from threading import Thread import functools # so print always flushes to stdout print = functools.partial(print, flush=True) def start_loop(loop): def run_forever(loop): print("Setting loop to run forever") asyncio.set_event_loop(loop) loop.run_forever() print("Leaving run forever") asyncio.set_event_loop(loop) print("Spawaning thread") thread = Thread(target=run_forever, args=(loop,)) thread.start() class Foo: def __init__(self, loop): print("in foo init") self.queue = asyncio.Queue() asyncio.run_coroutine_threadsafe(self.consumer(self.queue), loop) async def consumer(self, queue): print("In consumer") while True: message = await queue.get() print(f"Got message {message}") if message == "END OF QUEUE": print(f"exiting consumer") break print(f"Processing {message}...") def main(): loop = asyncio.new_event_loop() start_loop(loop) f = Foo(loop) f.queue.put("this is a message") f.queue.put("END OF QUEUE") loop.call_soon_threadsafe(loop.stop) # wait for the stop to propagate and complete while loop.is_running(): pass if __name__ == "__main__": main() Output:
Spawaning thread Setting loop to run forever in foo init Leaving run forever