Python多处理 - 从3个不同的函数返回值[重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我需要并行执行3个函数并从每个函数中检索一个值。

这是我的代码:

def func1():
   ...
    return x

def func2():
   ...
    return y

def func3():
   ...
    return z


p1 = Process(target=func1)
first = p1.start()
p2 = Process(target=func2)
second= p2.start()
p3 = Process(target=func3)
third = p3.start()
p1.join()
p2.join()
p3.join()

但是第一,第二和第三似乎是'NoneType'对象。

我的代码有什么问题?

谢谢

python process multiprocessing
2个回答
1
投票

有几种不同的方法可以解决这个问题。最简单的是使用multiprocessing.Poolapply_async函数:

from multiprocessing import Pool

def func1():
    x = 2
    return x

def func2():
    y = 1
    return y

def func3():
    z = 5
    return z

if __name__ == '__main__':
    with Pool(processes=3) as pool:
        r1 = pool.apply_async(func1, ())
        r2 = pool.apply_async(func2, ())
        r3 = pool.apply_async(func3, ())

        print(r1.get(timeout=1))
        print(r2.get(timeout=1))
        print(r3.get(timeout=1))

multiprocessing.Pool是一个有用的构造,它通过设置管道和队列以及需要什么来处理进程之间的底层通信。最常见的用例是使用.map函数将它与不同的数据一起使用到同一个函数(分配工作)。但是,它也可以用于不同的功能,例如, .apply_async构造就像我在这里做的那样。

但是,这不适用于解释器,但必须存储为.py文件并使用python filename.py运行。


0
投票

在了解了您的用例后,我建议使用multiprocessing.Pool。与@JohanL解决方案类似。

from multiprocessing import Pool

def func1(x):
    return x*x

def func2(y):
    return y*y

def func3(z):
    return z*z

p = Pool(3)
print(p.apply(func1, (2, )))
print(p.apply(func2, (3, )))
print(p.apply(func3, (4, )))
© www.soinside.com 2019 - 2024. All rights reserved.