2011-07-04 14 views
14

私はコルーチンに関する多くの講演や記事をPythonで見てきました。彼らは「マイクロスレッド」とみなされ、パフォーマンスを向上させると聞いてきました。コルーチンがパフォーマンスを向上させる方法

コルーチンがパフォーマンスをどのように改善しますか?これまで見たことから、それらはシングルスレッドであり、順番に実行されます。私は、デザインの観点から見ると、特にプロデューサー/コンシューマータイプのアプリケーションでは非常にエレガントであることに同意します。

私はポイントを逃していると思います。誰かが説明を助けることができますか

答えて

10

コルーチンは、非常に限定された意味を除いて、パフォーマンスを実際に向上させるものではありません。マルチスレッドプログラムには一定のオーバーヘッドがあり、コルーチンはこれらのオーバーヘッドを発生させることなくスレッド化の利点をもたらします。しかし、ほとんどのマルチスレッドアプリケーション(GILを持つC-Pythonでさえ)は、システムコールで1つのスレッドがブロックされ、他のスレッドが実行できるときにオーバーラップするという利点があります。これは一般にコルーチンでは起こりません。

スレッド数が少ない場合、通常はオーバーラップが優先され、コルーチンはパフォーマンス上の利点はありません。何千ものスレッドが必要な場合は、スレッドスイッチのオーバーヘッドがはるかに大きくなり、その状況ではコルーチンが利益をもたらすかもしれませんが、スレッド数を減らす方がはるかに大きなメリットがあります。

コルーチンの本当の利得は、プロデューサ/コンシューマアプリケーションでは、コーディングをはるかに簡単にするため、コーディングが高速になります。

8

これは良い質問です。David Beazley'sA Curious Course on Coroutines and Concurrencyを思い出しました。 Davidは、コルーチンがPythonでどのように機能するかを説明するだけでなく、実際にポケットに入っているユースケースについても優れた仕事をしています。

彼の記述は、通常はハンドラクラス(his presentationのスライド51を参照してください)を使用する同じタスクを達成するためのオーバーヘッドが少ないことを示しているようです。

@Duncan's answerのように、オーバーヘッドが多くのスレッドを持つような状況では、コルーチンはパフォーマンス上の勝利ですが、コルーチンは単なるパフォーマンスだけではありません。

関連する問題