2017-05-30 137 views
0

我在寫一個以並行方式執行函數的python程序。這裏是代碼:如何在python中的多處理進程中存儲函數的返回值?

from multiprocessing import Process 

def sqr(args): 
    results = [] 
    for i in args: 
     results.append(i*i) 
    return results 

def cube(args): 
    results = [] 
    for i in args: 
     results.append(i*i*i) 
    return results 

def main(): 
    data = [1,2,3,4,5] 
    p1 = Process(target=sqr, args=(data,)) 
    p1.start() 
    p2 = Process(target=cube, args=(data,)) 
    p2.start() 
    p1.join() 
    p2.join() 


main() 

我不知道我怎麼能得到的sqrcube函數的返回值。

我已經試過這樣:

from multiprocessing import Process 
from queue import Queue 

def sqr(args, q): 
    results = [] 
    for i in args: 
     results.append(i*i) 
    q.put(results) 

def cube(args, q): 
    results = [] 
    for i in args: 
     results.append(i*i*i) 
    q.put(results) 

def main(): 
    q = Queue() 
    data = [1,2,3,4,5] 
    p1 = Process(target=sqr, args=(data, q)) 
    p1.start() 
    p2 = Process(target=cube, args=(data, q)) 
    p2.start() 
    p1.join() 
    p2.join() 
    print(q.get()) 

main() 

這一計劃將暫停無限長的時間。我不明白這裏發生了什麼問題? 有人可以幫我,我該如何存儲函數的返回結果?任何幫助,將不勝感激。

+0

你使用Python2還是3? –

+0

我正在使用python 3 – Amit

+0

你在什麼操作系統上? – roganjosh

回答

0

如何使結果成爲全球性的?這應該工作:

from multiprocessing import Process 

results = [] 
def sqr(args): 
    for i in args: 
     results.append(i*i) 
    return results 

def cube(args): 
    for i in args: 
     results.append(i*i*i) 
    return results 

def main(): 
    data = [1,2,3,4,5] 
    p1 = Process(target=sqr, args=(data,)) 
    p1.start() 
    p2 = Process(target=cube, args=(data,)) 
    p2.start() 
    p1.join() 
    p2.join() 


main() 
+2

單獨的進程不共享相同的'results'列表,因爲它們具有單獨的mem空間。 –

1

我會用multiprocessing.Pool,執行順序立方體()和SQR(),然後並行使用Pool.map每個輸入()。這將消除隊列的需要並簡化許多基本功能。

from multiprocessing import Pool, cpu_count 

def sqr(n): 
    return (n*n) 

def cube(n): 
    return (n*n*n) 

def main(n): 
    return (cube(n),sqr(n)) 

with Pool(cpu_count()) as p: 
    inputs = [1,2,3,4,5,6,7,8,9] 
    results = p.map(main, inputs) 

print(list(results)) 

[(1, 1), (8, 4), (27, 9), (64, 16), (125, 25), (216, 36), (343, 49), (512, 64), (729, 81)] 
相關問題