質問

のコンセプト coroutine 音が非常に面白いかなんて全然分かっていないんだことは、あってはならないことで実際に生産す。何を活用例coroutines、解決することができます、より効率的に他の方法について教えてほしい。

役に立ちましたか?

解決

真のコルーチンには、ツールからのサポートが必要です-コンパイラによって実装され、基礎となるフレームワークによってサポートされる必要があります。

コルーチンの実世界の例の1つは、「yield return」 C#2.0で提供されるキーワード。これにより、ループのために複数の値を返すメソッドを作成できます。

「収益率」ただし、制限があります-実装はヘルパークラスを使用して状態をキャプチャし、コルーチンの特定のケースのみをジェネレーター(イテレーター)としてサポートします。

より一般的な場合、コルーチンの利点は、特定の状態ベースの計算を表現しやすく理解しやすくすることです。 。ただし、これを行うには、C#またはJavaにはまだ存在しないサポートとツールが必要です。

他のヒント

コルーチンとは何かを説明する良い回答がいくつかあります。

しかし、実際のユースケースでは。 Webサーバーを使用します。複数の同時接続があり、それらすべての読み取りと書き込みをスケジュールする必要があります。

これはコルーチンを使用して実装できます。各接続は、少量のデータを読み書きするコルーチンであり、その後「降伏」します。スケジューラへの制御。利用可能なすべての接続を循環するときに、次のコルーチン(同じことを行う)に渡します。

それらの多く、たとえば:

grep TODO *.c *.h | wc -l

上記のパイプラインはまさにコルーチンです: grep コマンドはバッファーに行く一連の行を生成し、 wc コマンドは「それらを食い尽くします」;バッファがいっぱいになると、 grep " blocks"バッファが空になるまで、バッファが空の場合、 wc コマンドは新しい入力を待ちます。

コルーチンについての事柄は、前述のPythonジェネレーターなどのより制約の多いパターンで、またはパイプラインとして使用されることが最も多いことです。

さらに詳しく知りたい場合は、Wikipediaの記事、特にコルーチンをご覧ください。 イテレーター

ごきげんよう、トメ子ですほぼ5年のだが、驚いていないのに使用の場合はゲームcoroutines多く使用されている本質的には時間でスライス計算である。

の維持の一貫したフレームレート、、、でも60fps、約16.6msコードが実行されます。を含む物理シミュレーション、入力処理、描画し塗装です。

きっメソッドが実行される各フレーム。場合の方法に時間が終わるまでに及ぶ複数のフレーム、お手法に興味を持った多くの組織が、計算のゲームのループをユーザーを見"jank"(急落のフレームレート)。

何coroutinesういう時このスライス計算のように行ってもちょこっとバリューアップ各フレーム。

そのためにはcoroutines基本的に可能にする方法"量"の計算の"呼び出し側が"(この場合において、ゲームのループ)は、次の呼び出しから再います。

コルーチンは、生産者/消費者パターンを実装するのに役立ちます。

たとえば、Pythonは generators という言語機能でコルーチンを導入しました。イテレータの実装を簡素化することを目的としていました。

これらは、各タスクがスケジューラ/リアクターに譲るコルーチンである協調マルチタスクを実装するのにも役立ちます。

コルーチンは、システムに2つ以上のコードがあり、その最も自然な表現が多くの待機を伴う連続した一連のステップである場合に役立ちます。

たとえば、LCDとキーパッドのユーザーインターフェイスとモデムを備えたデバイスを考えてみます。キーパッドのユーザーが何をしているかに関係なく、モデムを使用して定期的に呼び出してステータスを報告する必要があります。ユーザーインターフェイスを記述する最も良い方法は、" input_numeric_value(& CONV_SPEED_FORMAT、& conveyor_speed);"のような関数を使用することです。ユーザーが値を入力すると返されます。通信を処理する最も良い方法は、「wait_for_carrier();」などの関数を使用することです。ユニットが接続されるか、接続しないと判断した場合に戻ります。

コルーチンなしでは、UIサブシステムまたはモデムサブシステムのいずれかを、ステートマシンを使用して実装する必要があります。コルーチンを使用すると、両方のサブシステムを最も自然なスタイルで記述することができます。どちらのサブシステムも、「一貫性のある」状態にしない限り非常に長くなることが重要であることに注意してください。状態とyield()の呼び出し、また、「一貫性のある」状態にしないでyield()を呼び出します。最初に述べますが、通常、これらの制約を満たすことは難しくありません。

本格的なマルチタスクを使用することもできますが、共有状態が変更された場合は、場所を問わずロックを使用する必要があります。コルーチンスイッチャーはyield()呼び出し以外で物事を切り替えることはないので、次のyieldの前にすべてを順番に保証し、他のルーチンが状態を変更する準備ができている限り、いずれのルーチンも共有状態を自由に変更できます&quot ;中" yield()。

生産者/消費者ラインのより具体的な例として、控えめなバッチレポートプログラムのように単純なものが実際にコルーチンを使用できます。

この例の重要なヒントは、入力データを消費するための非自明な作業(たとえば、データの解析またはアカウントの料金と支払いの蓄積)、および出力を生成するための非自明な作業です。これらの特性がある場合:

  • 「送信」できる場合は、入力側のコードを簡単に整理/理解できます。さまざまな場所での作業単位。
  • 同様に、出力側のコードが「つかむ」ことができれば、それを整理/理解するのも簡単です。ネストされた制御構造内の次の作業単位。

コルーチンとキューはどちらも自由に使える素晴らしいテクニックです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top