2017-03-02 6 views
1

まだPythonの初心者です。わからない、なぜ私は5 2S引数を渡すときに、Pythonマルチプロセッシングプールasync_applyコールバックが機能しない

from multiprocessing import Pool 

results = [] 

def func(a=1): 
    if a == 1: 
     return 1 
    return 2 

def collect_results(result): 
    results.append(result) 

if __name__=="__main__": 

    poolObjects = [] 

    pool = Pool(processes=2) 

    poolObjects = [pool.apply_async(func, args=(2), callback=collect_results) for i in range(5)] 

    pool.close() 
    pool.join() 

    print results 

を含む配列を期待していしかし、私はこの

poolObjects = [pool.apply_async(func, callback=collect_results) for i in range(5)] 

にpoolObjectsラインを変更したときにそれが正常に動作しての配列を出力したときに、これは空の配列を出力します5つの1私はここで間違って何をしていますか?

+1

は(= '引数を変更しよう2) 'を' args =(2、) 'に置き換えます(コンマに注意してください)。 '(2)'はちょうど '2'と同じです。*コンマはタプル*を作成します! – Bakuriu

答えて

1

あなたの問題は引数をどのように渡しているかです:argsはタプル(またはシーケンス)でなければなりません。末尾のカンマが整数2.

を含む、長さ1のタプルを作成しますので、

... args=(2,) ... 

... args=(2) ... 

を変更する次に、あなたのプログラムはなぜそう

[2, 2, 2, 2, 2] 

を印刷します間違いはありませんでしたか?あなたがした;-) - しかし、それは抑制されました。このエラーは、メインプログラムではなく、プロセスの境界を越えて作業を送信するように手配するバックグラウンドマシンで発生します。そのようなエラーを報告する良い方法はないので、それらは抑止されています。

apply_asyncの場合、エラーは保存され、.get()を結果オブジェクトに適用するのを待っています。だから、

、例えば、あなたの元のプログラムの最後に、このループを追加します。

for f in poolObjects: 
    f.get() 

その後抑え、エラーがそうのように、報告されます。

TypeError: func() argument after * must be a sequence, not int 
+0

エラーを取得するための追加情報をありがとう!私が持っていたオリジナルのコードには複数のパラメータが含まれていて、実際には別の理由で失敗していました(これでエラーが表示されるようになりました:))。私が書いたサンプルコードは、欠落しているために失敗していますが、理由は同じだと思いました。 – ski

関連する問題