Программа Python будет
центральный менеджер и просто прочитал бы
задания из очереди, порождают процесс (или
подпроцесс?) с соответствующим C ++
программа для запуска работы, получить
результаты (подпроцесс stdout & stderr),
кормить это к обратному вызову и положить
процесс обратно в очереди процессов
в ожидании следующего задания.
Для этого вам не нужен модуль multiprocessing
. Модуль multiprocessing
подходит для запуска функций Python как отдельных процессов. Чтобы запустить программу на C ++ и прочитать результаты из stdout, вам понадобится только модуль subprocess
. Очередь может быть списком, и ваша программа на Python будет просто зацикливаться, пока список не пуст.
Однако, если вы хотите
- порождает несколько рабочих процессов
- чтобы они читали из общей очереди
- использовать аргументы из очереди для
программы spawn на C ++ (параллельно)
- использовать вывод программ на C ++
поставить новые предметы в очередь
тогда вы могли бы сделать это с multiprocessing
, как это:
test.py
import multiprocessing as mp
import subprocess
import shlex
def worker(q):
while True:
# Get an argument from the queue
x=q.get()
# You might change this to run your C++ program
proc=subprocess.Popen(
shlex.split('test2.py {x}'.format(x=x)),stdout=subprocess.PIPE)
out,err=proc.communicate()
print('{name}: using argument {x} outputs {o}'.format(
x=x,name=mp.current_process().name,o=out))
q.task_done()
# Put a new argument into the queue
q.put(int(out))
def main():
q=mp.JoinableQueue()
# Put some initial values into the queue
for t in range(1,3):
q.put(t)
# Create and start a pool of worker processes
for i in range(3):
p=mp.Process(target=worker, args=(q,))
p.daemon=True
p.start()
q.join()
print "Finished!"
if __name__=='__main__':
main()
test2.py (простая замена вашей программе на C ++):
import time
import sys
x=int(sys.argv[1])
time.sleep(0.5)
print(x+3)
Запуск test.py
может привести к примерно так:
Process-1: using argument 1 outputs 4
Process-3: using argument 3 outputs 6
Process-2: using argument 2 outputs 5
Process-3: using argument 6 outputs 9
Process-1: using argument 4 outputs 7
Process-2: using argument 5 outputs 8
Process-3: using argument 9 outputs 12
Process-1: using argument 7 outputs 10
Process-2: using argument 8 outputs 11
Process-1: using argument 10 outputs 13
Обратите внимание, что числа в правом столбце возвращаются в очередь и (в конечном итоге) используются в качестве аргументов для test2.py
и отображаются в виде чисел в левом столбце.