簡體   English   中英

如何將 multiprocessing.Pipe 設置為嵌套子流程?

[英]How can I set up a multiprocessing.Pipe to a nested subprocess?

我有一個包裝 python 腳本的可執行文件,可能如下簡單:

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

由於這個包裝層,我不能在multiprocessing.Process使用明顯的 API。

我想在孩子和父母之間建立一個多處理Pipe 下面的幼稚方法不起作用,因為Pipe返回的對象不可pickle:

# 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())

你必須使用shell包裝器代碼嗎? 如果您可以在my_child.py中的my_parent.py顯式調用 python 代碼,那么它應該更容易(即基本上只是管道示例)。

假設您不能這樣做,則可以以類似的方式創建命名管道,但更明確地使用mkfifo並僅傳遞管道的名稱。

我必須在您的.sh上添加一條 shebang 行,否則這里是一個示例:

# 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')

然后是子代碼:

# my_child.py
import os
import sys

pipename = sys.argv[1]
while True:
    with open(pipename, 'rb') as p:
    print(p.read())

這是您所詢問的操作系統管道版本,因此希望這很有趣,但不是您所詢問的事情的直接解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM