2017-06-26 5 views
0

内の別の関数内のメソッド私はPythonでマルチプロセッシングを持つ新しいですし、私が見てきたこれまでの全ての例では、この種のとおりです。同時パイソン

from multiprocessing import Process 
def f1(a): 
    #do something 

def f2(b): 
    #do something 

if __name__ == '__main__': 
    f1(a1) 
    p = Process(target=f2, args=(b2,)) 
    p.start() 
    p.join() 

私が代わりに別のファイルに2つの関数を呼び出す方法は次の行に似併存する必要がある場合は、

def function(): 
    #do something 
    file2.f1(a) #first concurrent method 
    file2.f2(b) #second concurrent method 

私はどのようにすればよいですか? 誰かが簡単な例を作ることができますか?私は、このようにしてみましたが、それは最初のループの後に、再びすべてのプログラムを開始します。

def function(): 
    #do something 
    for i in range(3): 
     p1 = Process(target=file2.f1, args=(a)) #first concurrent method 
     p2 = Process(target=file2.f2, args=(b)) #second concurrent method 
     p1.start() 
     p2.start() 
     p1.join() 
     p2.join() 
+1

は、なぜそれがすべての違いを生むでしょうか?そして、「それは正しく機能しません」とはどういう意味ですか? –

答えて

1

問題はargsをvarialbeが誤って定義されていることのようです、それはタプルではなく、単一の変数でなければなりません:

def function(): 
    #do something 
    for i in range(3): 
     p1 = Process(target=file2.f1, args=(a,)) #first concurrent method 
     p2 = Process(target=file2.f2, args=(b,)) #second concurrent method 
     p1.start() 
     p2.start() 
     p1.join() 
     p2.join() 

実行の順序は柔軟性があります場合は、複数の呼び出しをトリガーするプールのクラスを使用することができます:あなたは関数の内部でそれを行う場合

from multiprocessing.pool import Pool 

pool = Pool() 
pool.map_async(f1, [(arg,)] * 3) 
pool.map_async(f2, [(arg,)] * 3) 
pool.close() 
pool.join() 
+0

ありがとうございましたElisha、私はタプルとして試しましたが、まだ問題を与えています(今回はforループの中に入っていませんでした)。いいえ、注文は柔軟ではありません – Joe

+0

@Giuseppeはトレースバックですか? –

+0

私はそれを解決したと思います。問題は、プログラムに他の「メイン」がないことでした。今私はロギング部分を解決しようとしています – Joe