[英]Can I use asyncio to read from and write to a 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.