如何设置multiprocessing.Pipe到嵌套子流程?

时间:2019-06-17 07:28:13

标签: python python-multiprocessing

我有一个包装了python脚本的可执行文件,也许很简单,如下所示:

# my_child_wrapper.sh
echo About to start the child
python my_child.py "$@"
echo Child finished

由于这个包装层,我无法使用multiprocessing.Process中明显的API。

我想在孩子和父母之间建立一个多处理Pipe。下面的幼稚方法行不通,因为Pipe返回的对象不可腌制:

# my_parent.py
import multiprocessing

a, b = multiprocessing.Pipe()
def run_child():
    subprocess.check_call(['my_child_wrapper.sh', pickle.dumps(b)])
Thread(target=run_child).start()
a.send('Some python object')
# my_child.py
import sys
import pickle

b = pickle.loads(sys.argv[1])
while True:
    print(b.recv())

1 个答案:

答案 0 :(得分:1)

您必须使用外壳包装代码吗?如果您可以在my_child.py的{​​{1}}中显式调用python代码,那么它应该会更容易(即 基本上只是管道example)。

假设您无法执行此操作,则可以用类似的方式创建命名管道,但可以更明确地使用my_parent.py并仅传递管道名称。

我必须在您的mkfifo上添加一条shebang线,但以下是示例:

.sh

然后是子代码:

# my_parent.py
from threading import Thread
import os
import subprocess

pipename = 'mypipe'
try:
    os.mkfifo(pipename)
except FileExistsError:
    pass

# start child
def run_child():
    subprocess.check_call(['/MYPATH/my_child_wrapper.sh', pipename])
Thread(target=run_child).start()

# send data
with open(pipename, 'wb') as p:
    p.write(b'Something')

这是您所要求的内容的OS管道版本,很有趣,但不是您所要求的内容的简单解决方案。