Python pipe.send()在Mac OS上挂起

时间:2014-04-24 20:08:43

标签: python macos pipe hang

如果我在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()

1 个答案:

答案 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模块代码,但我猜测挂起正在发生,因为管道正在尝试从封闭端开始读取阻止等待回复。