私は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.mapはIt blocks until the result is ready.
と書いてありますが、それはAll functions will complete before we move to the next line of code
です。
私はそれを誤解していますか?プールを使用している場合、タスクが完了するために常にpool.close()
とpool.join()
に電話する必要がありますか?
編集:私はAWS上で実行していますが、それが明らかな違いがある場合は、同僚が私に言わなければならないと言いました。
ありがとうございました!
です。つまり、 'pool.close();スクリプトの最後にあるpool.join()を呼び出すと、すべてのサブプロセスが終了するのを待ちます。これはstdout 'flush()'を意味しますか? – Hoopes