2015-09-28 16 views
5

私の理解に基づいて、スレッドは並列に実行することはできません(可用性とランダムに基づいて実行されます)。その理由はEventletが使用されています。Pythonマルチプロセッシングとイベントレット

イベントレットが並列性のためのものであれば、なぜPythonのマルチプロセッシングモジュールを使用できないのですか?

私はマルチプロセスモジュールを実行し、すべてのプロセスが完了したかどうかを確認するためにjoinメソッド()を使用することを考えました。

私の理解が正しいかどうか誰かが説明できますか? (可用性とランダムに基づいて実行される)

+1

私は間違っているかもしれませんが、私がEventletを読んだこと(これまで聞いたことがない、ヒントありがとうございます)は、非ブロッキングIOを実行するため、実行の流れがあるアクションから次のアクションプールに。まあ、CPythonの真のスレッドはGILのために並列に実行されていませんが、次のスレッドはI/O操作でブロックされている間に実行できます。だから理論的には違いはないはずです(プログラミングの容易さは別として)。誰でも私の思考の列車を確認/修正してもらえますか? – Pynchia

答えて

0

私の理解に基づいて、スレッドを並列に実行することができない

正しい

とEventletが使用されている理由のthats。

あまり正確ではありません。 Eventletライブラリは、ノンブロッキングIOプログラミングを簡素化するために使用されます。それはではありませんは実際に並列性を追加します。スレッドの実行は、GILのために一度に1つのスレッドに制限されます。しかし、IOバインドされたスレッド、特にお互いに対話する必要のないスレッドを起動し、スケジューリングし、管理するプロセスを大幅に簡素化するので、これが使用されます。

私が述べたようにEventletsは、並列処理

のためのより多くのであれば、これは、彼らがために存在するものではありません。

なぜPythonのマルチプロセッシングモジュールを使用できないのですか?私は、複数のプロセスモジュールを実行し、すべてのプロセスが完了したかどうかを確認するためにjoinメソッド()を使用することを考えました。

することができます。そして、あなたはこのアプローチで実際の並列実行を得るでしょう。しかし、あなたは同じスピードアップを得ることはできません。マルチプロセッシングライブラリは、インタープリタへのより頻繁なアクセスを必要とするものであるため、CPUバウンドの並列タスクに適しています。複数のプロセスの実行と管理のオーバーヘッドのために、IOバインドされたタスクでマルチプロセッシングを使用すると、実際には実行時間が長くなることがあります。


としては、両方を試し、最も最適化と実行時間の質問の場合であるとプロファイリングは、アプリケーションのための「最良の」オプションを使用している保証する確実な方法です。 Eventletsを使用するコードを記述してから、通常のスレッドまたはマルチプロセッシングを使用するように変更する場合は、スレッドまたはプロセスを管理するために定型コードを書く必要があります。より明らかになります。