【发布时间】:2014-03-11 03:03:34
【问题描述】:
我有一个进程使用 Python 2.7 的 multiprocessing.Listener() 连接到管道,并等待带有 recv() 的消息。我在 Windows 7 和 Ubuntu 11 上运行它。
在 Windows 上,管道称为 \\.\pipe\some_unique_id。在 Ubuntu 上,管道称为 /temp/some_unique_id。除此之外,代码是一样的。
一切正常,直到在一个不相关的错误中,monit 启动了同一程序的第二个副本。它会尝试监听完全相同的管道。
我天真地*预计第二次连接尝试会失败,而第一次连接不会受到影响。
相反,我发现行为是officially undefined。
请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,则管道中的数据可能会损坏。
在 Ubuntu 上,较早的副本似乎被忽略,并且没有任何消息,而最新版本胜出。
在 Windows 上,有一些更复杂的行为。有时原始管道会在 recv() 调用上引发 EOFError 异常。有时,允许两个监听器共存,并且每条消息都是任意分布的。
有没有办法独占打开管道,所以第二个进程无法打开管道,而第一个进程没有关闭或退出?
* 我可以发誓我手动测试了这个确切的场景,但显然我没有。
我查看的其他 SO 问题:
【问题讨论】: