2016-06-17 23 views
5

Ho due funzioni da eseguire in parallelo e ognuna di esse restituisce un valore. Devo aspettare che entrambe le funzioni finiscano e quindi elaborare i ritorni da esse. Come potrei ottenere questo in Python. PresumoOttieni il valore di ritorno per le funzioni di multielaborazione in python

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

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

voglio fun1 e fun2 per l'esecuzione in parallelo e poi bisogno di calcolare

valsum = val1+val2 

risposta

6

Utilizzando 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 orari della funzione da eseguire, e restituisce un concurrent.futures.Future oggetto.

concurrent.futures.Future.result restituisce il valore restituito restituito dalla funzione.


Utilizzando 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 restituisce un oggetto AsyncResult, e AsyncResult.get restituirà il valore di ritorno della funzione, una volta finito e il risultato arriva.

+0

L'utilizzo di concurrent.futures funziona correttamente ma non quando si utilizza multiprocessing.pool. Dà un errore che dice AssertionError: ai processi demonici non è permesso avere figli quando si usa il secondo metodo. – TheStupidOne

+0

@TheStupidOne, funziona bene per me. Potresti mostrare il traceback completo? – falsetru