【发布时间】:2011-12-21 18:59:07
【问题描述】:
我最近一直在学习如何使用 Python 多处理模块,并阅读了官方文档。在16.6.1.2. Exchanging objects between processes 中有一个关于使用管道交换数据的简单示例。
并且,在16.6.2.4. Connection Objects 中有这样的声明,引用了“如果没有任何东西可以接收并且另一端已关闭,则引发 EOFError”。
因此,我将示例修改为如下所示。恕我直言,这应该会触发 EOFError 异常:没有发送任何内容并且发送端已关闭。
修改后的代码:
from multiprocessing import Process, Pipe
def f(conn):
#conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
#print parent_conn.recv() # prints "[42, None, 'hello']"
try:
print parent_conn.recv()
except EOFError:
pass
p.join()
但是,当我在我的 Ubuntu 11.04 机器 Python 2.7.2 上尝试修改后的示例时,脚本挂起。
如果有人能指出我错过了什么,我将不胜感激。
【问题讨论】:
-
请删除“或有错误”。出现错误的概率几乎为零。专注于可能的解释——误读或不清楚的文档。
-
@S.Lott,你是对的。这是我的疏忽——根本不是错误。忘记了 Python 的引用计数,以及使用双工管道的最佳实践。
标签: python multiprocessing pipe