如何获取传递给 multiprocessing.Process 的函数的返回值?

新手上路,请多包涵

在下面的示例代码中,我想获取函数的返回值 worker 。我该怎么做呢?这个值存储在哪里?

示例代码:

 import multiprocessing

def worker(procnum):
    '''worker function'''
    print str(procnum) + ' represent!'
    return procnum

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()
    print jobs

输出:

 0 represent!
1 represent!
2 represent!
3 represent!
4 represent!
[<Process(Process-1, stopped)>, <Process(Process-2, stopped)>, <Process(Process-3, stopped)>, <Process(Process-4, stopped)>, <Process(Process-5, stopped)>]

我似乎无法在存储在 jobs 中的对象中找到相关属性。

原文由 Louis Thibault 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

使用 共享变量 进行通信。例如像这样:

 import multiprocessing

def worker(procnum, return_dict):
    """worker function"""
    print(str(procnum) + " represent!")
    return_dict[procnum] = procnum

if __name__ == "__main__":
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i, return_dict))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()
    print(return_dict.values())

原文由 vartec 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为@sega_sai 建议的方法更好。但它确实需要一个代码示例,所以这里是:

 import multiprocessing
from os import getpid

def worker(procnum):
    print('I am number %d in process %d' % (procnum, getpid()))
    return getpid()

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes = 3)
    print(pool.map(worker, range(5)))

这将打印返回值:

 I am number 0 in process 19139
I am number 1 in process 19138
I am number 2 in process 19140
I am number 3 in process 19139
I am number 4 in process 19140
[19139, 19138, 19140, 19139, 19140]

如果您熟悉 map (Python 2 内置),这应该不会太具有挑战性。否则请查看 sega_Sai 的链接

请注意需要多少代码。 (还要注意流程是如何重用的)。

原文由 Mark 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题