スレッドやマルチプロセッシングを効率やコードの明瞭性の観点から使用することを決定する際に、適切なガイドラインは何ですか?Python:スレッドとマルチプロセッシングを使用する場合
答えて
スレッディングとマルチプロセッシングの違いの多くは、実際にはPython固有のものではなく、一部の違いは特定のPython実装固有のものです。 CPythonのために
、私は次の例のいずれかでfoはmultiprocessing
モジュールを使用します。
私はパフォーマンス上の理由から、同時に複数のコアを使用するようにする必要があります。グローバルインタプリタロック(GIL)は、スレッドを使用するときのスピードアップを防ぎます。 (場合によっては、メインワークがというCコードで実行されている場合や、Cythonを使用してGILを明示的にリリースする場合など、スレッドを使用することもあります。このケースは実際にはまれです。ほとんどのアプリケーションはプロセッサ時間に制限されず、実際にはPythonを使用しません。
アプリケーションを後で実際の分散アプリケーションに変えたいと思っています。これは、マルチプロセッシング・アプリケーションの方がはるかに簡単です。
実行するタスク間に必要な共有状態はほとんどありません。
ほぼすべての他の状況で、私はスレッドを使用します。 (これは、GUIアプリケーションが応答することが含まれる。)コードをわかりやすく、最大のものの一つが知っていることを学ぶと、スレッド(またはプロセス間で話をするためにQueueオブジェクトを愛することであるために
multiprocessingを使用している場合は...マルチプロセッシングを持っていますits own Queue object)。キューは物事をより簡単にし、私はもっとクリーンなコードを可能にすると思います。
私はいくつかのまともなキューの例についてはa lookがあったが、この1つはそれらを使用する方法のいくつかの素晴らしい例があり、どのように便利な、彼らは(マルチプロセッシングキューの申請まったく同じロジックで)です:については http://effbot.org/librarybook/queue.htm
効率の場合、詳細と結果はほとんどの人にはあまり影響しませんが、Pythonの場合< = 3.1 CPythonの実装にはマルチコアマシン上で興味深い(潜在的で残念な)効率問題があります。これらの問題にはthe GILが含まれます。デビッド・ビーズレーはa video presentationをしばらくやっており、それは確かにの価値のあるです。 More info here(この正面の重要な改善点については、Python 3.2で説明しています)。
GIL関連のマルチコアの問題の私の安い要約は、複数のスレッドを使用してCPython < = 2.7から完全なマルチプロセッサの使用を期待している場合は、パフォーマンスがあまり良くない場合は驚かないでください、または単一コアよりも悪いことがあります。しかし、あなたのスレッドがたくさんのI/O(ファイルの読み書き、DBアクセス、ソケットの読み込み/書き込みなど)を行っている場合、あなたはその問題に気付かないかもしれません。
マルチプロセッシングモジュールは、プロセッサごとにPythonインタプリタ(およびGIL)を作成することによって、この潜在的なGIL問題を完全に回避します。
ほとんどのPythonコードでは、Python 3.xの複数のスレッドから速度を上げることはできません。これ以上遅くなることはありません。 –
@Sven:「ほとんどのコード」と言うのは公正だとは思わない。それは真剣にコードが何であるかによって異なります!すなわち、コードが非Pythonのものを待つのに費やす時間はどれくらいですか?その間、別のPythonスレッドは、その間にハムすることができます。多くの入出力、GUIの操作、またはプロセッサの重いC拡張(GILをリリースしたと仮定)を使用すると、スレッドは巨大な違いを生むことがあります。あなたが誰と話しているかに応じて、「ほとんどのコード」にはWebサーバーが含まれています。この場合、多くのフレーバーが大きな利点につながります(http://nichol.as/benchmark-of-python-web-servers)。 – Russ
他のスレッドが(GUIコードのように)ブロックしている間にスレッドを使用して並列呼び出しを行うと、[speedup](http://en.wikipedia.org/wiki/Speedup)(Iこれらのユースケースは私の答えに言及しました)。そして、あなたがプロセッサーが多いC拡張のスピードアップを得ることができますが、これはPythonコードとは限りません:)正直言って、私のコメントはあまり明確ではありませんでした。 –
- 1. Python、マルチプロセッシングでスレッドを使用する
- 2. TensorFlow-GPU + Pythonマルチプロセッシングを使用する場合のバグ?
- 3. スレッドを使用したマルチプロセッシング?
- 4. Python:マップとマルチプロセッシングを使用
- 5. Webクローラー用のPythonスレッドまたはマルチプロセッシング?
- 6. Pythonでのマルチプロセッシングとスレッド化の状況
- 7. パンダとマルチプロセッシングを使用したPython IndexError
- 8. isinstance racing typeError(マルチプロセッシングで使用する場合)Lock
- 9. この場合、Pythonでのマルチプロセッシングの使い方は?
- 10. マルチプロセッシングを使用するPythonコードのプロファイリング?
- 11. リストをpythonマルチプロセッシングで使用する
- 12. Pythonマルチプロセッシング - オンデマンドでワーカーを使用する
- 13. Pythonマルチプロセッシング。virtualenvを使用する処理
- 14. PythonマルチプロセッシングでOMP_NUM_THREADS = 1を使用する
- 15. Python 2.7で__init__を使用しない場合と使用する場合
- 16. スレッド/マルチプロセッシング/キュー?
- 17. python copy.copyを使用する場合
- 18. Pythonマルチプロセッシングとイベントレット
- 19. Pythonスケルトンとマルチプロセッシング
- 20. マルチプロセッシングとSelenium Python
- 21. Pythonマルチプロセッシングとファイルシーク
- 22. sklearn用のPythonマルチプロセッシングの使用NN
- 23. Python:マルチプロセッシングを使用する場合の処理された要素の数を確認してください。
- 24. マルチプロセッシングを使用したPython pintモジュール
- 25. ツイストのリアクタを使用したPythonマルチプロセッシング
- 26. cx_freeze sys.stdout.flush()とマルチプロセッシングを使用
- 27. PythonとWindowsを使ったマルチプロセッシング
- 28. マルチプロセッシングとマルチスレッドを使用するときにファイルをロックする - Python
- 29. HPCクラスタでのPythonマルチプロセッシングの使用
- 30. slurmでのPythonのマルチプロセッシングの使用
"対イベントループ"を忘れました。 –
スレッドを使用するときは、グローバルインタープリタロックのために副作用について言及する必要があります。 –
@Mike DeSimone - 私は同意します! :) – Russ