首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何恢复传递给multiprocessing.Process的函数的返回值?

如何恢复传递给multiprocessing.Process的函数的返回值?
EN

Stack Overflow用户
提问于 2012-05-02 21:44:35
回答 12查看 272.3K关注 0票数 265

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

示例代码:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
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中的对象中找不到相关的属性。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-05-02 21:55:08

使用shared variable进行通信。例如:

代码语言:javascript
复制
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())
票数 266
EN

Stack Overflow用户

发布于 2015-03-02 05:09:39

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

代码语言:javascript
复制
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)))

它将打印返回值:

代码语言:javascript
复制
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 (Python2内置),这应该不会太困难。否则,请看看sega_Sai's link

请注意,所需的代码是多么少。(还要注意进程是如何被重用的)。

票数 79
EN

Stack Overflow用户

发布于 2016-06-10 05:41:45

对于正在寻求如何使用QueueProcess获取值的任何其他人

代码语言:javascript
复制
import multiprocessing

ret = {'foo': False}

def worker(queue):
    ret = queue.get()
    ret['foo'] = True
    queue.put(ret)

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    queue.put(ret)
    p = multiprocessing.Process(target=worker, args=(queue,))
    p.start()
    p.join()
    print(queue.get())  # Prints {"foo": True}

请注意,在Windows或Jupyter Notebook中,使用multithreading时,您必须将其另存为文件并执行该文件。如果在命令提示符下执行此操作,您将看到如下错误:

代码语言:javascript
复制
 AttributeError: Can't get attribute 'worker' on <module '__main__' (built-in)>
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10415028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档