2016-06-17 30 views
5

Mam dwie funkcje do równoległego działania i każda z nich zwraca wartość. Muszę poczekać, aż obie funkcje zakończą się, a następnie przetworzyć zwroty z nich. Jak mogłem to osiągnąć w pytonie. ZakładamyUzyskaj wartość zwracaną dla funkcji przetwarzania wielokrotnego w pythonie

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

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

Chcę fun1 i fun2 biec równolegle, a następnie trzeba obliczyć

valsum = val1+val2 

Odpowiedz

6

Korzystanie 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 harmonogramów funkcję, która ma być wykonana, i zwraca Obiekt concurrent.futures.Future.

concurrent.futures.Future.result zwraca wartość zwracaną zwracaną przez funkcję.


Stosując 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 zwraca obiekt AsyncResult i AsyncResult.get zwraca wartość powrotną funkcji po jego końca, a wynik otrzymaniu.

+0

Korzystanie z pliku concurrent.futures działa poprawnie, ale nie w przypadku użycia opcji wieloprocesorowy.pool. Daje błąd, który mówi AssertionError: procesy demoniczne nie mogą mieć dzieci podczas korzystania z tej drugiej metody. – TheStupidOne

+0

@ TheStupidOne, Działa to dobrze dla mnie. Czy możesz pokazać pełny zwrot pieniędzy? – falsetru