オリジナル:https://www.liaoxuefeng.com/wiki/897692888725344/923057403198272
また、マイクロスレッドと呼ばれるコルーチンは、シュレッド。英語コルーチン。
コルーチンの概念は非常に早く育ち、近年まで広くにいくつかの言語(例えばルア)で使用されてきました。
Aなど、すべての言語で呼び出し階層は、実装プロセスではB、Bを呼び出し、Cと呼ばれ、Cはリターンを完了し、Bの完成実装を返すサブルーチンや関数が呼び出され、Aが最終的に終了されます。
だから、サブルーチンコールスタックによって達成され、スレッドはサブルーチンを実行することです。
サブルーチンコールは常に入り口で、注文するリターンコールは明らかです。コルーチンコールとサブルーチン異なります。
コルーチンもルーチンに見えますが、実装プロセスは、サブルーチン内に中断し、次に実行するために再び戻って、適切な時間に、別のルーチンを実行するために有効にしてすることができます。
サブルーチン内でCPUの割り込みに多少似て他のルーチンではなく、関数呼び出しを実行するために、中断していることに注意してください。例えば、Bのサブルーチン。
DEF (): 印刷 ' 1 ' 印刷 ' 2 ' 印刷 ' 3 'の DEF B(): 印刷 ' X ' 印刷 ' Y ' 印刷 ' Z '
コルーチンの実行が想定、Aさんの実行がBを実行するために、任意の時点で中断されていてもよく、Bは、再び中断されていてもよい実行時行い、結果であってもよいです。
1 2 X 、Y 3 Z
しかし、Aは困難であることを、関数呼び出しを理解するよりも、そうコルーチン呼び出し、Bと呼ばれていません。
Aの実装では、Bはビットマルチスレッドのように見えるが、そのように実行のスレッド特性をコルーチン、および利点は、コルーチンよりも、マルチスレッドこと何ですか?
最大の利点は、高効率のコルーチンです。スイッチは、スレッド切り替えルーチンではなく、プログラム自体により、従って、スレッド切り替えのオーバーヘッド、及びマルチスレッド比ことなく、スレッドの数が大きいほど、より多くの明白な性能上の利点は、コルーチン。なぜなら
一つのスレッドだけ、変数を書き込み中に競合がない、共有リソースの制御は、単に裁判官の状態のように、コルーチンにロックされ、その性欲の効率化されていないため、2番目の大きな利点は、マルチスレッドのロック機構を必要としないということです多くの高いスレッド。
コルーチンが実行のスレッドがあるので、どのようにマルチコアCPU、それを活用するには?最も簡単な方法は、マルチプロセス+コルーチンで、両方のマルチコア、高効率を最大限に活用し、協会のプロセスを十分に発揮する、高性能の可用性。
Pythonのサポートコルーチンは、発電機での収率はある程度のコルーチンに達成することができて、まだ非常に限られています。サポートは完全ではありませんが、すでにかなりの電力を再生することができます。
例を見てください:
伝統的な生産 - 消費者モデルは、スレッドは、キューを制御し、待機するようにロック機構を介して、メッセージを取るが、それはデッドロックする可能性が信じて、メッセージスレッドを書くことです。
収量ジャンプが開始されて、消費者が終了するまで、コドライブの生産への切り替えは、消費者に直接メッセージを生成する場合は、生産、高効率化を継続して生産に切り替えます。
インポート時間 DEF 消費者(): R = '' ながらTRUE: N = 降伏R なら ないN: リターン プリント(' [CONSUMER】消費%S ... '%N) time.sleep( 1 ) R = ' 200 OK 「 DEF (C)を製造: c.next() 、N = 0 ながら N <5 : N = N + 1 の印刷(' [PRODUCER]%S ...生産'%のN) 、R = c.send(N) プリント(' [PRODUCER]消費者リターン:%S '%のR) c.close() もし __name__ == ' __main__ ' : C = 消費者() 農産物(C)
結果:
[PRODUCER]生産1 ... [CONSUMER]消費1 ... [PRODUCER]消費者のリターン:200 OK [PRODUCER]生産2 ... [CONSUMER]消費2 ... [PRODUCER]消費者のリターン:200 OK [PRODUCER ]生産3 ... [CONSUMER]消費する3 ... [PRODUCER]消費者のリターン:200 OK [PRODUCER]生産4を... [CONSUMER]消費4 ... [PRODUCER]消費者のリターン:200 OK [PRODUCER]プロデュース5 ... [CONSUMER]消費5 ... [PRODUCER]消費者のリターン:200 OK
消費者に注目すると、通過した後、消費者を生成するために、ファンクションジェネレータ(発電機)です。
-
最初のコールc.next()発電機を起動します。
-
次に、消費者を実行するc.send(n)を切り替えることにより、何かの生産、一度。
-
消費者は、収率、治療、及び収率によって返される結果を介してメッセージを取得します。
-
私たちは次のメッセージを生成し続け、結果を得るために、消費者のプロセスを作り出します。
-
私たちは、消費者のc.close()、全体のプロセスの終了によって閉じられ、生産を生成しないことを決定しました。
ノーので、「コルーチン」プリエンプティブマルチタスクではなく、スレッドと呼ばれる、タスクを完了するために、スレッドで実行されるプロセス全体をロック生産し、消費者のコラボレーション。
最後に、ドナルド・クヌースの文章要約コルーチンの特性を適用します。
「サブルーチンはコルーチン特殊なケースのようなものです。」