如果我在Mac OS上返回足够大的字符串,则以下程序始终挂在Mac OS
(Python 2.7.5)上。我无法确定限制是什么,但它适用于较小的文本。
它在Ubuntu
上运行正常,但挂在pipe_to_parent.send(result)
上。
有人知道如何解决这个问题吗?下面的代码有什么问题吗?
#!/usr/bin/python
import sys
from multiprocessing import Process, Pipe
def run(text, length):
return (text * ((length / len(text))+1))[:length]
def proc_func(pipe_to_parent):
result = {'status': 1, 'log': run('Hello World', 20000), 'details': {}, 'exception': ''}
pipe_to_parent.send(result)
sys.exit()
def call_run():
to_child, to_self = Pipe()
proc = Process(target=proc_func, args=(to_self,))
proc.start()
proc.join()
print(to_child.recv())
to_child.close()
to_self.close()
call_run()
答案 0 :(得分:2)
documentation显示的示例存在一些差异,如下所示:
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()
# This is the important part
# Note: conn.recv() is called _before_ process.join()
print parent_conn.recv() # prints "[42, None, 'hello']"
p.join()
在您的示例中,您在之后调用了.recv()
,您已经调用了process.join()
。
...
proc = Process(target=proc_func, args=(to_self,))
proc.start()
proc.join()
print(to_child.recv())
...
要确切了解发生了什么,我们必须查看multiprocessing
模块代码,但我猜测挂起正在发生,因为管道正在尝试从封闭端开始读取阻止等待回复。