9

async/awaitパターン (Scala、F#、C# などで知られている) と継続との関係はどうなっているのだろうと思っています。

  • async/パターンはawait本格的な継続の限られたサブセットですか? (もし本当なら、継続はどのようにより表現力豊かになりますか?)
  • 継続はasync/の実装手法の 1 つにすぎawaitませんか? (もしそうなら、他にどのような実装アプローチが存在しますか?)
  • それとも、async/awaitおよび継続は、制御フロー/データフローの抽象化を可能にするという唯一の共通点がある、単なる直交概念ですか?
4

1 に答える 1

5

この 2 つの関係は次のようになります。async-これawaitはプログラミング言語が使用する手法であり、同期しているように見える (たとえば、明示的な継続デリゲートがない) コードを記述できますが、実際には非同期で実行されます。これは、関数の実行の現在の状態を表すオブジェクトを作成し、それを待機中の操作の継続として登録することによって実現されます。

つまり、async-await 継続を使用します。

async/パターンはawait本格的な継続の限られたサブセットですか? (もし本当なら、継続はどのようにより表現力豊かになりますか?)

あなたはそれを言うことができます。継続はより一般的な概念であり、async非同期awaitを実現するためにのみ使用します。

たとえば、継続渡しスタイルのプログラミングでは、操作ごとに 2 つの継続 (1 つは成功の場合、もう 1 つは失敗の場合) を持つことで、例外処理を実装できます。asyncこの継続の使用は-とは何の関係もありませんawait(おそらくラムダとして、各継続を明示的に記述する必要があります)。

継続はasync/の実装手法の 1 つにすぎawaitませんか? (もしそうなら、他にどのような実装アプローチが存在しますか?)

async継続の概念は-の中心にあると言えawaitます。

コアとなるアイデアは、関数の実行を一時asyncawaitに停止し、後で再開することです。そのためには、その再開に使用できる何らかのオブジェクトが必要です。継続とはまさにこのことです。

于 2014-04-03T11:58:20.027 に答える