Как настроить многопроцессорную обработку. Пайп для вложенного подпроцесса? - PullRequest
1 голос
/ 17 июня 2019

У меня есть исполняемый файл, который упаковывает скрипт Python, возможно, такой простой, как следующий:

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

Из-за этого слоя упаковки я не могу использовать очевидные API в multiprocessing.Process.

Я бы хотел установить многопроцессорную обработку 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 Ответ

1 голос
/ 17 июня 2019

Нужно ли использовать код оболочки оболочки? Если вы можете явно вызывать код Python в my_child.py в 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')

А потом дочерний код:

# my_child.py
import os
import sys

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

Это версия ОС, о которой вы спрашивали, так что, надеюсь, это интересно, но не является простым решением того, что вы спрашивали о том, что делаете.

...