2017-12-05 7 views
1

Multiprocessingでしばらくの間苦労しています。Pythonです。 2つの独立した関数を同時に実行し、両方の計算が終了するまで待ってから、両方の関数の出力を続けます。マルチプロセッシング2つの異なる機能python3

マルチプロセッシングの他の例が見つかりましたが、1つの関数しか使用しなかったか、出力を返しませんでした。誰でもこれを行う方法を知っていますか?どうもありがとう!

+0

機能I/Oがバインドされているか、プロセッサがバインドされていますか? – wwii

+0

あなたは 'Pool.apply_async'を試しましたか? – georgexsh

+0

両方の機能はウェブサイトからのデータをスクリーンキャプチャしているので、I/Oバウンドだと思います。 –

答えて

1

(プールの一部ではなく)手動でプロセスを作成し、multiprocessing.Queueを通じてメインプロセスに戻り値を送信することをお勧めします。これらのキューは、ほぼすべてのPythonオブジェクトを安全かつ効率的な方法で共有できます。

投稿したジョブを使用した例です。

Result of job 0 is: 20 
Result of job 1 is: 1 

をしかし、あなたはもちろん、あなたがこれらの値を使用したいのですが、さらにどんな処理を行うことができます。

def jobA(num, q): 
    q.put(num * 2) 

def jobB(num, q): 
    q.put(num^3) 

import multiprocessing as mp 
q = mp.Queue() 
jobs = (jobA, jobB) 
args = ((10, q), (2, q)) 
for job, arg in zip(jobs, args): 
    mp.Process(target=job, args=arg).start() 

for i in range(len(jobs)): 
    print('Result of job {} is: {}'.format(i, q.get())) 

これは、出力します。

+0

各機能がキューに入れる値/オブジェクトには、その場所に関する情報が含まれているようですこれを正しく使うことができるようになりました。おそらくタプル '(func_name、return_value)'のようです。 '...両方の計算が終了するまで待ってください::あなたの例の最後のforループを実行する前に、' is_alive 'の間に各プロセスまたはループを 'join'したいと思うでしょう。 – wwii

+0

@wwiiもちろん、必要に応じて、データの「ソース」に関する情報を追加することができます。しかし、キューはスレッド/プロセスセーフなので、 'join()'を呼び出す必要はなく、 'get()'の呼び出しは新しいオブジェクトが利用可能になるまでブロックします。 – bnaecker

+0

これは 'apply_async'と同じように動作しませんか? – georgexsh

関連する問題