2011-01-17 14 views
29

スレッドやマルチプロセッシングを効率やコードの明瞭性の観点から使用することを決定する際に、適切なガイドラインは何ですか?Python:スレッドとマルチプロセッシングを使用する場合

+5

"対イベントループ"を忘れました。 –

+2

スレッドを使用するときは、グローバルインタープリタロックのために副作用について言及する必要があります。 –

+0

@Mike DeSimone - 私は同意します! :) – Russ

答えて

16

スレッディングとマルチプロセッシングの違いの多くは、実際にはPython固有のものではなく、一部の違いは特定のPython実装固有のものです。 CPythonのために

、私は次の例のいずれかでfoはmultiprocessingモジュールを使用します。

  • 私はパフォーマンス上の理由から、同時に複数のコアを使用するようにする必要があります。グローバルインタプリタロック(GIL)は、スレッドを使用するときのスピードアップを防ぎます。 (場合によっては、メインワークが​​というCコードで実行されている場合や、Cythonを使用してGILを明示的にリリースする場合など、スレッドを使用することもあります。このケースは実際にはまれです。ほとんどのアプリケーションはプロセッサ時間に制限されず、実際にはPythonを使用しません。

  • アプリケーションを後で実際の分散アプリケーションに変えたいと思っています。これは、マルチプロセッシング・アプリケーションの方がはるかに簡単です。

  • 実行するタスク間に必要な共有状態はほとんどありません。

ほぼすべての他の状況で、私はスレッドを使用します。 (これは、GUIアプリケーションが応答することが含まれる。)コードをわかりやすく、最大のものの一つが知っていることを学ぶと、スレッド(またはプロセス間で話をするためにQueueオブジェクトを愛することであるために

6

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問題を完全に回避します。

+1

ほとんどのPythonコードでは、Python 3.xの複数のスレッドから速度を上げることはできません。これ以上遅くなることはありません。 –

+0

@Sven:「ほとんどのコード」と言うのは公正だとは思わない。それは真剣にコードが何であるかによって異なります!すなわち、コードが非Pythonのものを待つのに費やす時間はどれくらいですか?その間、別のPythonスレッドは、その間にハムすることができます。多くの入出力、GUIの操作、またはプロセッサの重いC拡張(GILをリリースしたと仮定)を使用すると、スレッドは巨大な違いを生むことがあります。あなたが誰と話しているかに応じて、「ほとんどのコード」にはWebサーバーが含まれています。この場合、多くのフレーバーが大きな利点につながります(http://nichol.as/benchmark-of-python-web-servers)。 – Russ

+0

他のスレッドが(GUIコードのように)ブロックしている間にスレッドを使用して並列呼び出しを行うと、[speedup](http://en.wikipedia.org/wiki/Speedup)(Iこれらのユースケースは私の答えに言及しました)。そして、あなたがプロセッサーが多いC拡張のスピードアップを得ることができますが、これはPythonコードとは限りません:)正直言って、私のコメントはあまり明確ではありませんでした。 –

関連する問題