如何在Python的多进程中存储函数返回值?

5
我正在编写一个Python程序,以并行方式执行函数。以下是代码:

我正在编写一个Python程序,以并行方式执行函数。以下是代码:

from multiprocessing import Process

def sqr(args):
    results = []
    for i in args:
        results.append(i*i)
    return results

def cube(args):
    results = []
    for i in args:
        results.append(i*i*i)
    return results

def main():
    data = [1,2,3,4,5]
    p1 = Process(target=sqr, args=(data,))
    p1.start()
    p2 = Process(target=cube, args=(data,))
    p2.start()
    p1.join()
    p2.join()


main()

我不知道如何获取和函数的返回值。

我尝试过这样做:

from multiprocessing import Process
from queue import Queue

def sqr(args, q):
    results = []
    for i in args:
        results.append(i*i)
    q.put(results)

def cube(args, q):
    results = []
    for i in args:
        results.append(i*i*i)
    q.put(results)

def main():
    q = Queue()
    data = [1,2,3,4,5]
    p1 = Process(target=sqr, args=(data, q))
    p1.start()
    p2 = Process(target=cube, args=(data, q))
    p2.start()
    p1.join()
    p2.join()
    print(q.get())

main()

这个程序将会无限期地挂起。我不明白出了什么问题? 有人可以帮帮我吗,如何储存函数的返回结果?非常感谢。


我正在使用 Python 3。 - Amit
我正在使用Ubuntu操作系统。 - Amit
如果您想以这种方式解决问题,应该使用 multiprocessing.Queuequeue.Queue 适用于多线程。现在,由于其他 进程 正在写入其自己的队列副本,因此原始进程将无限期地等待 q.get() 中的数据。 - Ilja Everilä
你的代码不是很清晰,能否帮我理解你的目标?你想并行计算一个数字列表的立方,并将结果存储在单个列表中吗? - alec_djinn
1
@roganjosh 刚刚使用了 multiprocessing.Queue 进行测试,原始代码运行良好。@Amit 你所说的 Ubuntu 操作系统是指真正的 Linux,还是 Windows 10 的 Bash for plah plah? - Ilja Everilä
显示剩余7条评论
3个回答

5
我会使用multiprocessing.Pool,按顺序执行cube()和sqr(),然后使用Pool.map()并行处理每个输入。这将消除对Queue的需求,并简化主要函数。
from multiprocessing import Pool, cpu_count

def sqr(n):
    return (n*n)

def cube(n):
    return (n*n*n)

def main(n):
    return (cube(n),sqr(n))

with Pool(cpu_count()) as p:
    inputs = [1,2,3,4,5,6,7,8,9]
    results = p.map(main, inputs)

print(list(results))

[(1, 1), (8, 4), (27, 9), (64, 16), (125, 25), (216, 36), (343, 49), (512, 64), (729, 81)]

0

在进程之间共享资源有三种选择:

  1. 文件(例如pickle,cPickle,marshal等)
  2. 共享内存(例如队列)
  3. 管道

0

把结果变量设为全局的,这样可以解决问题:

from multiprocessing import Process

results = []
def sqr(args):
    for i in args:
        results.append(i*i)
    return results

def cube(args):
    for i in args:
        results.append(i*i*i)
    return results

def main():
    data = [1,2,3,4,5]
    p1 = Process(target=sqr, args=(data,))
    p1.start()
    p2 = Process(target=cube, args=(data,))
    p2.start()
    p1.join()
    p2.join()


main()

3
不同的进程不共享同一个“results”列表,因为它们有独立的内存空间。 - Ilja Everilä

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接