python非阻塞recv与进程之间的管道?

Posted

技术标签:

【中文标题】python非阻塞recv与进程之间的管道?【英文标题】:python non blocking recv with pipe between processes? 【发布时间】:2015-07-28 12:38:32 【问题描述】:

看到这行代码但找不到文档

self.conn.setblocking(0)

问题是,如何在不阻塞的情况下轮询一个管道池? 有一个父进程需要与一些不稳定的子进程通信,并希望定期轮询并检查他们是否有话要说。如果他们决定需要更多时间才能有新内容要说,请不要阻止。这会神奇地做到这一点吗?

【问题讨论】:

【参考方案1】:

创建管道将返回两个连接对象。连接对象提供轮询功能,您可以在其中检查是否有要读取的内容。轮询功能允许您指定等待的超时时间。

如果您有一组正在等待的连接对象,那么您可以使用 multiprocessing.connection.wait() 或它的非多处理版本。

详情见 https://docs.python.org/3/library/multiprocessing.html#multiprocessing.connection.Connection 这将向您显示连接对象的详细信息。看看投票功能

【讨论】:

【参考方案2】:

这很可能是您正在查看的内容:https://docs.python.org/2/library/socket.html#socket.socket.setblocking

您没有提供太多细节,所以我不确定您要做什么,但通常当您有多个要轮询的套接字时,您将使用select(请参阅这些@987654323 @来自 PyMOTW)。

【讨论】:

进程之间的管道也是套接字吗? 不确定你说的是哪个管道,但那是一个套接字函数,所以 self.conn 几乎可以肯定是一个套接字。大多数“管道”也将通过某种套接字在下面实现。 最终使用了 select,它与管道完美配合,满足我们的需求 如果有人可以提供一些最低限度的示例代码,我会对此表示赞同。在 Windows 上出现错误并且文档存在冲突(有些地方说 select 在 win 上有效,但 poll 不适用,有些地方说 unix 仅适用于所有人)。如果我们有一些已知的工作代码,我可以检查它是否是平台问题或我错过了什么:)【参考方案3】:

您可以检查 p.poll(0) 如果结果为 True 则管道不为空,您可以在不阻塞的情况下接收数据。

【讨论】:

以上是关于python非阻塞recv与进程之间的管道?的主要内容,如果未能解决你的问题,请参考以下文章

如果在超时发生之前没有收到数据,Python 的 socket.recv() 会为非阻塞套接字返回啥?

未发出信号的非阻塞 ConnectNamedPipe 事件

关于socket阻塞与非阻塞情况下的recvsendreadwrite返回值

[转] 比较清楚的阻塞与非阻塞和同步与异步

非阻塞套接字轮询与阻塞套接字

什么可能导致非阻塞套接字阻塞“recv”?