2017-03-16 24 views
2

PythonでPool.apply_asyncで実行された関数の結果を得たいと思います。マルチプロセッシングの結果を得る方法.Pool.apply_async

結果を親プロセスの変数に代入する方法はありますか?私はコールバックを使用しようとしましたが、それは複雑に思えます。

class Result(): 
    def __init__(self): 
     self.val = None 

    def update_result(self, val): 
     self.val = val 

result = Result() 

def f(x): 
    return x*x 

pool.apply_async(f, (10,), callback=result.update_result) 

スレッドが実行され、result.valを更新する、それがあなたのコールバックを呼び出します、結果を計算します。

+0

あなたの質問を編集し、コールバックを使って試したコードを含めてください(これは 'apply_async()'で行うしかありません)。 – martineau

答えて

4

ソリューションは非常に簡単です:

import multiprocessing 

def func(): 
    return 2**3**4 

p = multiprocessing.Pool() 
result = p.apply_async(func).get() 
print(result) 

Pool.apply_async()AsyncResultを返すので、あなたは、単にAsyncResult.get()方法から結果を得ることができます。

希望すると便利です。

+0

ありがとうございます。これはきれいです。 get()は任意のオブジェクト型を返すことができますか? – THN

+3

@thn - ほとんどの場合...サブプロセスはpicklableオブジェクトのみを返すことができます。プールはそれを親に戻すためにデータをシリアライズする必要があり、それがその方法です。 – tdelaney

+0

私は参照してください。 +1はシリアライズに言及しているので、シリアライズのオーバーヘッドについて考える必要があります。 – THN

0

まあ簡単な方法は、次のようにヘルパークラスを持っているだろう。

いずれにしても、スレッドが終了したことを確認する必要があります。

+0

ありがとうございます。グローバル変数にする必要がありますか?サブプロセスでアクセスされるのですか? – THN

+1

必ずしもそうではありません。ただし、resultはpool.apply_asyncの呼び出しと同じスコープである必要があります。 –

+0

ありがとうございます。 – THN

関連する問題