web-dev-qa-db-ja.com

非同期呼び出しとコールバックの違いは何ですか

非同期呼び出しコールバックの違いを理解するのは少し混乱しています。

私はこの記事を読みます CallBacksについて教える しかし、回答アドレスはありません非同期呼び出しとどのように違いますか。

これはCallbacks=Lambda Expressions

コールバックは別のスレッドで実行されていますか?

誰でも簡単な英語でこれを説明できますか?

25
Jude Niroshan

非常に簡単に言えば、コールバックは非同期である必要はありません。

http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls

  1. 同期:

    API呼び出しが同期的である場合、続行する前にAPI呼び出しが戻るのをコード実行がブロック(または待機)することを意味します。これは、APIから応答が返されるまで、アプリケーションはそれ以上実行されないことを意味します。これは、ユーザーがアプリケーションの遅延またはパフォーマンスラグとして認識する可能性があります。ただし、API応答が受信された場合にのみ適切に実行されるアプリ内のコードがある場合、API呼び出しを同期的に行うことは有益です。

  2. 非同期:

    非同期呼び出しは、API呼び出しがサーバーから戻るのをブロック(または待機)しません。プログラム内で実行が継続され、サーバーから呼び出しが返されると、「コールバック」関数が実行されます。

Java、C、およびC#では、「コールバック」は通常(「メインイベントループ」に関して)同期的です。

一方、Javascriptでは、コールバックは通常asynchronous-呼び出される関数を渡しますが、コールバックが呼び出されるまで他のイベントは処理され続けます。

どんなJavascriptイベントがどの順序で発生するか気にしない場合-すばらしい。それ以外の場合、Javascriptで非同期動作を管理するための非常に強力なメカニズムの1つは、「約束」を使用することです。

http://www.html5rocks.com/en/tutorials/es6/promises/

PS:追加の質問に答えるには:

  1. はい、コールバックはラムダかもしれません-しかし、それは要件ではありません。

    Javascriptでは、ほぼすべてのコールバックが「匿名関数」(基本的に「ラムダ式」)になります。

  2. はい、コールバックは別のスレッドから呼び出される場合がありますが、これは必須ではありません。

  3. また、コールバックは(そして頻繁に)spawnスレッド(したがって、それ自体を「非同期」にする)を行うことができます。

「助けてくれる希望

================================================== ==================

また会ったね:

Q:@ paulsm4では、実行フローでコールバックと非同期呼び出しがどのように機能するかの例を詳しく説明していただけますか?それは大いに役立つでしょう

  1. 最初に、「コールバック」の定義に同意する必要があります。ここに良いものがあります:

    https://en.wikipedia.org/wiki/Callback_%28computer_programming%29

    コンピュータプログラミングでは、callbackは、他のコードに引数として渡される実行可能コードの一部であり、コールバック(実行)が期待されます。都合の良い時間に引数。呼び出しは、同期コールバックのように即座に行われる場合もあれば、非同期のように後で発生する場合もありますコールバック

  2. 「同期」と「非同期」も定義する必要があります。基本的に-コールバックが呼び出し元に戻る前にすべての処理を行う場合、それは「同期」です。呼び出された直後に呼び出し元に戻ることができ、呼び出し元とコールバックが並行して動作できる場合、それは「非同期」です。

  3. 同期コールバックの問題は、それらが「ハング」しているように見える可能性があることです。非同期コールバックの問題は、「順序付け」の制御を失う可能性があることです。「A」が「B」の前に発生することを必ずしも保証することはできません。

  4. コールバックの一般的な例は次のとおりです。

    a)ボタンを押すハンドラー(「ボタン」ごとに異なる「応答」があります)。これらは通常「非同期」に呼び出されます(GUIのメインイベントループによって)。

    b)ソートの「比較」関数(したがって、一般的な「sort()」関数は異なるデータ型を処理できます)。これらは通常「同期的に」呼び出されます(プログラムから直接呼び出されます)。

  5. コンクリートの例:

    a)「print()」関数を備えた「C」言語プログラムがあります。

    b)「print()」は、「PrintHP()」、「PrintCanon()」、および「PrintPDF()」の3つのコールバックのいずれかを使用するように設計されています。

    c)「PrintPDF()」はライブラリを呼び出してデータをPDFでレンダリングします。それは同期です-.pdfレンダリングが完了するまで、プログラムは "print()"から戻りません。それは通常かなり速く進むので、問題はありません。

    d)「PrintHP()」と「PrintCanon()」をコーディングして、物理プリンターへのI/Oを実行するスレッドを生成しました。 「Print()」は、スレッドが作成されるとすぐに終了します。実際の「印刷」は、プログラムの実行と並行して行われます。これら2つのコールバックは「非同期」です。

Q:理にかなっていますか?それは役立ちますか?

50
paulsm4

それらは非常に似ていますが、これは単なるモーです。

コールバックを使用する場合、コールバックするメソッドを指定し、コールバックするメソッドに依存します。コールバックを指定してどこでも終了することができますが、コールバックが保証されるわけではありません。

非同期プログラミングでは、通常の同期プログラミングと同様に、呼び出しスタックは開始位置まで巻き戻されます。

警告:他の非同期手法があるので、C#の待機機能について具体的に考えています。

2
user1763100