2017-02-08 3 views
1

私はmultiprocessingを使っていくつかのWebリクエストをPythonで並列化しようとしていますが、mapに送信するすべての機能が完了しないことがあります。私はpythonの2または3を使用しているかどうかをPythonマルチプロセッシングプール.mapがブロックされていませんか?

これらの結果が表示され

テストスクリプト:

for i in `seq 1 50`; do ./test.py | wc -l; done | sort | uniq -c 

をそして私の結果は次のようになります。

#!/usr/bin/env python 

import multiprocessing 

def my_print(string): 
    print(string) 

all_strings = ["alpaca", "bear", "cat", "dog", "elephant", "frog"] 

pool = multiprocessing.Pool() 
pool.map(my_print, all_strings) 

私はそうのようにそれを実行します:

6 5 
44 6 

...ほとんどの場合、関数の6つの実行はすべて実行されていますが、スクリプト全体が実行を完了するまで実行されるのはたった5つです。結果として、50 6があると期待しています(別名、すべての関数がすべての実行で実行されています)。

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.mapIt blocks until the result is ready.と書いてありますが、それはAll functions will complete before we move to the next line of codeです。

私はそれを誤解していますか?プールを使用している場合、タスクが完了するために常にpool.close()pool.join()に電話する必要がありますか?

編集:私はAWS上で実行していますが、それが明らかな違いがある場合は、同僚が私に言わなければならないと言いました。

ありがとうございました!

答えて

1

mapが返される前に、すべての作業者が関数を実行して値を返します。それは本当です。しかし、すべての文字列がすぐに表示されるわけではありません。

複数のワーカープロセスが同じファイル/端末に書き込もうとしています。その作業を行うには、import sysにして、ワーカープロセス内のすべてのprint()の後にsys.stdout.flush()と呼ぶ必要があります。

+0

です。つまり、 'pool.close();スクリプトの最後にあるpool.join()を呼び出すと、すべてのサブプロセスが終了するのを待ちます。これはstdout 'flush()'を意味しますか? – Hoopes

関連する問題