Python程序将是中央管理器,只需从队列中读取作业,并使用适当的C++程序生成进程(或子进程?)来运行作业,获取结果(子进程stdout和stderr),将其馈送到回调函数中,并将进程放回等待下一个作业运行的进程队列中。你不需要使用multiprocessing模块。multiprocessing模块适用于将Python函数作为单独的进程运行。要运行C++程序并从stdout读取结果,您只需要使用subprocess模块。队列可以是列表,Python程序只需在列表非空时循环即可。但是,如果您想要:生成多个工作进程、它们从共同的队列中读取、使用队列参数并行生成C++程序、使用C++程序的输出将新项放入队列,则可以像这样使用multiprocessing:test.py
import multiprocessing as mp
import subprocess
import shlex
def worker(q):
while True:
x=q.get()
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()
q.put(int(out))
def main():
q=mp.JoinableQueue()
for t in range(1,3):
q.put(t)
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
的参数使用,出现在左侧列中。