【发布时间】:2020-02-14 21:10:20
【问题描述】:
我正在启动一个新进程(编辑适用于新线程的相同内容),用于来自异步事件循环的计算。新进程有它自己的异步事件循环运行并且运行良好,没有任何阻塞行为。
我创建了两个队列(multiprocessing.Queue 或 multiprocessing.Manager.Queue),一个用于传出消息,另一个用于传入消息。我对两个队列都有相同的行为。传出消息的队列工作正常,因为我在队列中放置/获取消息:
await asyncio.get_running_loop().run_in_executor(None, self.incoming_queue.put, msg)
msg = await asyncio.get_running_loop().run_in_executor(None, self.incoming_queue.get, True, 1)
但是,当我尝试使用 asyncio run_in_executor 命令在原始 asyncio 应用程序中运行相同的 get() 命令时,它只是挂起。事件循环本身似乎很好并且反应灵敏。
禁用工作队列不会改变任何事情,执行程序(默认、线程或进程)也不会改变。
想法?
【问题讨论】:
-
你能创建一个最小的例子,我们可以运行它来观察相同的行为吗?
-
当我继续调试时,我了解到这可能与 Django Channels(我试图集成到的应用程序)中的事件循环的某些配置有关。我创建了一个更简单的 asyncio 循环来运行代码,每个队列似乎都运行良好。如果有任何变化,我会在几个小时内更新,如果我没有更多有用的信息,我可能会在那时删除问题。
标签: python python-multiprocessing python-asyncio