在Python中获取多进程函数的返回值

11

我有两个需要并行运行的函数,每个函数都会返回一个值。我需要等待这两个函数都完成后,再处理它们的返回值。在Python中,我应该如何实现?假设

def fun1():
   #do some calculation#
   return val1

def fun2():
   #do some calculation#
   return val2

我希望fun1和fun2能够并行运行,并且需要计算它们的结果。
valsum = val1+val2
2个回答

17

使用 concurrent.futures:

from concurrent.futures import ProcessPoolExecutor as Executor
#from concurrent.futures import ThreadPoolExecutor as Executor  # to use threads
with Executor() as executor:
    future1 = executor.submit(fun1, arg1, arg2, ...)
    future2 = executor.submit(fun2, arg1, arg2, ...)
    val1, val2 = future1.result(), future2.result()
    valsum = val1 + val2

concurrent.futures.Executor.submit函数安排要执行的函数,并返回一个concurrent.futures.Future对象。

concurrent.futures.Future.result函数返回被执行函数的返回值。


使用multiprocessing.pool

from multiprocessing.pool import Pool
#from multiprocessing.pool import ThreadPool as Pool  # to use threads
with multiprocessing.pool.Pool() as pool:
    result1 = pool.apply_async(fun1, (arg1, arg2, ...))
    result2 = pool.apply_async(fun2, (arg1, arg2, ...))
    val1, val2 = result1.get(), result2.get()
    valsum = val1 + val2

multiprocessing.pool.Pool.apply_async 返回一个 AsyncResult 对象,AsyncResult.get 会在函数执行完毕并返回结果后返回函数的返回值。


使用concurrent.futures工作正常,但是使用multiprocessing.pool时不行。它会给出一个错误,说断言错误:当使用后一种方法时,守护进程不允许拥有子进程。 - TheStupidOne
@TheStupidOne,对我来说它运行良好。你能展示完整的回溯吗? - falsetru
2
我在很多地方看到的最干净的答案。大多数示例使用.map(),但那不是唯一的解决方案。 - Timbus Calin

0
这是一个简单的示例,使用列表推导式并在每个future上调用.result(),直到进程返回为止阻塞:
import concurrent.futures

def download_video(data):
    # print(data) 
    return data

with concurrent.futures.ProcessPoolExecutor() as executor:
    futures = [executor.submit(download_video, x, ) for x in your_list]
    results = [result.result() for result in futures]

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