【问题标题】:Why is my queue hanging with asyncio event loop为什么我的队列挂着异步事件循环
【发布时间】:2020-02-14 21:10:20
【问题描述】:

我正在启动一个新进程(编辑适用于新线程的相同内容),用于来自异步事件循环的计算。新进程有它自己的异步事件循环运行并且运行良好,没有任何阻塞行为。

我创建了两个队列(multiprocessing.Queuemultiprocessing.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


【解决方案1】:

根据我的调查,我决定在这里做出回答。简而言之:出于某种原因,在新进程中的新事件循环中起作用的东西在 Django Channels 事件循环中不起作用。

我当前的解决方案是手动创建一个新线程来运行我的同步侦听器。我正在研究为什么 Channels 事件循环在我的用例中不起作用的选项。

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 2017-04-14
    • 1970-01-01
    • 2018-09-15
    • 2018-09-18
    • 2014-10-06
    • 2017-07-07
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多