2017-05-30 44 views
0

私は並列に関数を実行するpythonプログラムを書いています。私はsqrcube関数の戻り値を得ることができる方法のアイデアを持っていない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() 

:ここではコードです。

私はこれを試してみました:

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

あなたはどんなOSをお使いですか? – 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

別々のプロセスは、別々のmemスペースを持つので、同じ 'results'リストを共有しません。 –

1

Iは順次立方体()およびSQR()を実行した後Pool.mapを使用して、各入力に対して並列化する、multiprocessing.Poolを使用します()。これにより、キューの必要性がなくなり、基本機能が大幅に単純化されます。

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)] 
関連する問題