web-dev-qa-db-ja.com

コルーチンとは何ですか?

コルーチンとは何ですか?それらは並行性とどのように関係していますか?

174
yesraaj

コルーチンと同時実行性はほぼ直交しています。コルーチンは一般的な制御構造であり、それにより、フロー制御は、戻らずに2つの異なるルーチン間で協調的に渡されます。

Python=の 'yield'ステートメントは良い例です。コルーチンを作成します。'yield 'が見つかると、関数の現在の状態が保存され、呼び出し元の関数に制御が戻ります。その後、呼び出し元の関数は実行をyield関数に戻すことができ、その状態は「yield」に遭遇した時点まで復元され、実行が継続されます。

122
user21714

Luaでのプログラミング 、「Coroutines」セクションから:

コルーチンはスレッドに似ています(マルチスレッドの意味で):独自のスタック、独自のローカル変数、独自の命令ポインタを備えた実行ラインです。しかし、グローバル変数と他のほとんどは他のコルーチンと共有しています。スレッドとコルーチンの主な違いは、概念的に(または文字通り、マルチプロセッサマシンで)、スレッドを含むプログラムが複数のスレッドを並列に実行することです。一方、コルーチンは協調的です。任意の時点で、コルーチンを含むプログラムはそのコルーチンの1つだけを実行し、この実行中のコルーチンは、明示的に中断を要求した場合にのみ実行を中断します。

ポイントは次のとおりです:コルーチンは「共同作業」です。マルチコアシステムであっても、常に実行されるコルーチンは1つだけです(ただし、複数のスレッドを並行して実行できます)。コルーチン間にプリエンプティブではないため、実行中のコルーチンは実行を明示的に放棄する必要があります。

concurrency」については、Rob Pikeの slide を参照できます。

並行性は、独立して実行される計算の構成です。

したがって、コルーチンAの実行中に、コルーチンBに制御を渡します。その後、コルーチンBは、コルーチンAに制御を戻します。dependencyコルーチン間で、タンデムで実行する必要があるため、2つのコルーチンはconcurrencyではありません。

67
Nan Xiao

技術的な質問ですが、ほとんどの答えは技術的すぎると感じています。コルーチンのプロセスを理解しようとして苦労しました。私はそれを取得しますが、同時に取得しません。

私はここでこの答えを非常に役立ちました:

https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9

Idan Aryeからの引用:

あなたの物語をさらに発展させるために、私はそれを次のようなものにしました。

あなたは漫画を見始めますが、それはイントロです。イントロを見る代わりに、ゲームに切り替えてオンラインロビーに入りますが、3人のプレイヤーが必要で、あなたとあなたの妹だけがそこにいます。他のプレイヤーが参加するのを待つ代わりに、宿題に切り替えて、最初の質問に答えます。 2番目の質問には、視聴する必要があるYouTubeビデオへのリンクがあります。あなたはそれを開きます-そしてそれはロードを開始します。ロードするのを待つ代わりに、漫画に切り替えます。イントロが終わったので、見ることができます。今コマーシャルがあります-しかし、その間にサードプレイヤーが参加しているので、ゲームに切り替えます。

アイデアは、タスクを非常に高速に切り替えて、すべてを一度に実行しているように見えるようにするだけではないということです。何かが起こるのを待っている時間(IO)を利用して、直接的な注意が必要な他のことを行います。

間違いなくリンクをチェックしてください。すべてを引用することはできません。

26
mr1031011

コルーチンは、サブルーチン/スレッドに似ています。違いは、呼び出し元がサブルーチン/スレッドを呼び出すと、呼び出し元の関数に戻らないことです。しかし、コルーチンは、いくつかのコードを実行した後に呼び出し元に戻り、呼び出し元が独自のコードの一部を実行して、実行を停止してそこから続行するコルーチンのポイントに戻ることができます。すなわち。コルーチンには複数の入り口と出口があります

11
Twinkle
  • コルーチンは、Kotlin Languageで利用できる優れた機能です
  • コルーチンは、非同期の非ブロッキングコード(およびその他)を記述する新しい方法です
  • コルーチンは軽量スレッドです。軽量スレッドとは、ネイティブスレッドにマッピングしないことを意味するため、プロセッサでコンテキストを切り替える必要がないため、高速です。
  • ネイティブスレッドにはマッピングされません
  • コルーチンとスレッドは両方ともマルチタスクです。ただし、スレッドはOSによって管理され、コルーチンはユーザーによって管理されます。

基本的に、コルーチンには2つのタイプがあります。

  1. スタックレス
  2. スタックフル

Kotlinはスタックレスコルーチンを実装します-つまり、コルーチンは独自のスタックを持たないため、ネイティブスレッドにマッピングされません。

これらはコルーチンを開始する関数です:

launch{}

async{}

ここから詳細を学ぶことができます:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9

9
Dhaval Jivani

別の注意として、python geventライブラリはcoroutineベースのネットワークライブラリで、非同期ネットワーク要求などのスレッドのような機能を提供します。スレッドの破壊使用されるcoroutineライブラリーはgreenletです。

4
joseph

から Pythonコルーチン

Pythonコルーチンは多くのポイントで一時停止および再開できます(コルーチンを参照)。コルーチン関数の本体内で、awaitおよびasync識別子は予約キーワードになります。await式、async forおよびasync withコルーチン関数本体でのみ使用できます。

From コルーチン(C++ 20)

コルーチンは、resumedlaterになるように実行を一時停止できる関数です。コルーチンはスタックレスです。呼び出し元に戻ることで実行を中断します。これにより、非同期的に実行するシーケンシャルコード(たとえば、明示的なコールバックなしで非ブロッキングI/Oを処理する)が可能になり、レイジー計算された無限シーケンスやその他の用途のアルゴリズムもサポートされます。

他の回答と比較:

私の意見では、resumed laterの部分は、@ Twinkleのようにコアの違いです。
ドキュメントの多くのフィールドはまだ進行中ですが、この部分は@Nan Xiaoを除き、ほとんどの回答に似ています

一方、コルーチンは協調的です。任意の時点で、コルーチンを含むプログラムはそのコルーチンの1つだけを実行し、この実行中のコルーチンは、明示的に中断を要求した場合にのみ実行を中断します。

プログラムはLuaのプログラムから引用されているため、おそらく言語関連(現在Luaに精通していない)であるため、すべてのドキュメントがonly one部分に言及しているわけではない。

コンカレントとの関係:
コルーチン(C++ 20) の「実行」部分があります。ここで引用するには長すぎます。
詳細の他にも、いくつかの状態があります。

When a coroutine begins execution  
When a coroutine reaches a suspension point  
When a coroutine reaches the co_return statement  
If the coroutine ends with an uncaught exception  
When the coroutine state is destroyed either because it terminated via co_return or uncaught exception, or because it was destroyed via its handle 

@ user217714の回答に基づく@Adam Aroldのコメントとして。並行性です。
ただし、マルチスレッドとは異なります。 std :: threadから

スレッドを使用すると、複数の機能を同時に実行できます。スレッドは、関連付けられたスレッドオブジェクトの構築(OSスケジューリング遅延の保留)の直後に、コンストラクター引数として提供される最上位関数から実行を開始します。最上位関数の戻り値は無視され、例外をスローして終了した場合、std :: terminateが呼び出されます。最上位レベルの関数は、戻り値または例外をstd :: promiseを介して、または共有変数を変更することによって呼び出し側に通知できます(同期が必要になる場合があります。std:: mutexおよびstd :: atomicを参照)

並行性であるため、特に待機が避けられない場合(OSの観点から)、マルチスレッドのように機能します。これも混乱の原因です。

1
Shihe Zhang