'How to use multiprocessing.Event in an asyncio event loop?
I am using the multiprocessing
module to create a Process. In this child process, it will run an asyncio
event loop, and in the parent process, I am not. How can I use syncronization primitives for this pair of processes?
Let's say I want a way for the child process to wait for a message from the parent process. If I wasn't using asyncio, I would use multiprocessing.Event
. In the parent process, I create the Event
and pass it to the child process when I create it. To use, I would call event.set()
in the parent process, and in the child process I would use event.wait()
.
My understanding is that this wouldn't work in asyncio
because Event.wait
is blocking, and you can't/shouldn't ever block the asyncio event loop.
How can I write a class that works similarly to multiprocessing.Event
, but which has an async-aware wait()
method?
Solution 1:[1]
On could wrap the blocking call into a awaitable via loop.run_in_executor()
and await it somewhere.
# somewhere else
event = mp.Event()
# main
loop = asyncio.get_event_loop()
f = loop.run_in_executor(None, event.wait)
await f
# or wrap future in a task and wait for it
pending = loop.create_task(coro)
while pending:
done, pending = asyncio.wait(pending, timeout=2)
# do other things with it
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |