2016-06-17 2 views
5

У меня есть две функции для параллельной работы, и каждый из них возвращает значение. Мне нужно дождаться завершения обеих функций, а затем обработать их возврат. Как я могу достичь этого в python. ПредположимПолучить возвращаемое значение для функций многопроцессорности в python

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

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

Я хочу fun1 и fun2 запускать параллельно, а затем нужно вычислить

valsum = val1+val2 

ответ

6

Использование 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 вернет возвращаемое значение функции, когда он закончить и результат прибыть.

+0

Использование concurrent.futures работает нормально, но не при использовании multiprocessing.pool. Это дает ошибку, которая говорит AssertionError: демоническим процессам не разрешается иметь детей при использовании последнего метода. – TheStupidOne

+0

@ TheStupidOne, Он отлично работает для меня. Не могли бы вы показать полную трассировку? – falsetru