Pythonでmultiprocessingを行う際、各プロセスの返り値を取得したいということがあったので備忘として残しておく。
色々と調べてみたところ、以下のように multiprocessing.Pipe
を使って返り値を配列として取得し、それを後ほど分解するのがよさそうだ。
import multiprocessing
def worker(string, send_rev):
result = str(string) + '_result'
send_rev.send(result)
def main():
job_list = []
pipe_list = []
for i in range(10):
get_rev,send_rev = multiprocessing.Pipe(False)
p = multiprocessing.Process(target=worker, args=(i, send_rev))
job_list.append(p)
pipe_list.append(get_rev)
p.start()
for proc in job_list:
proc.join()
result_list = [x.recv() for x in pipe_list]
print(result_list)
if __name__ == '__main__':
main()
test@test:~$ cat test_multi.py
import multiprocessing
def worker(string, send_rev):
result = str(string) + '_result'
send_rev.send(result)
def main():
job_list = []
pipe_list = []
for i in range(10):
get_rev,send_rev = multiprocessing.Pipe(False)
p = multiprocessing.Process(target=worker, args=(i, send_rev))
job_list.append(p)
pipe_list.append(get_rev)
p.start()
for proc in job_list:
proc.join()
result_list = [x.recv() for x in pipe_list]
print(result_list)
if __name__ == '__main__':
main()
test@test:~$ python test_multi.py
['0_result', '1_result', '2_result', '3_result', '4_result', '5_result', '6_result', '7_result', '8_result', '9_result']
test@test:~$ python3 test_multi.py
['0_result', '1_result', '2_result', '3_result', '4_result', '5_result', '6_result', '7_result', '8_result', '9_result']