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

Ami*_*it 5 python multithreading multiprocessing

我正在编写一个以并行方式执行函数的 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()
Run Code Online (Sandbox Code Playgroud)

我不知道如何获得sqrcube函数的返回值。

我已经尝试过这个:

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()
Run Code Online (Sandbox Code Playgroud)

该程序将无限期暂停。我不明白这里出了什么问题?谁能帮我,我如何存储函数的返回结果?任何帮助,将不胜感激。

ale*_*inn 5

我将使用 multiprocessing.Pool 顺序执行cube()和sqr(),然后使用Pool.map()对每个输入进行并行化。这将消除对队列的需要,并简化主要功能。

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)]
Run Code Online (Sandbox Code Playgroud)


Sam*_*ler 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()
Run Code Online (Sandbox Code Playgroud)

  • 单独的进程不共享相同的“结果”列表,因为它们具有单独的内存空间。 (3认同)