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']