web-dev-qa-db-ja.com

非同期および同期の用語

プログラミングに関連する場合、非同期という用語で混乱します。プログラミング用語では、辞書で定義されているものとは逆の意味のようです。たとえば、Word synchronousは次のことを意味します。

  1. 同時に発生します;時間内に一致します。同時期;同時。

  2. 同じ速度で正確に一緒に進行します。一緒に繰り返す。

それでも、ウィキペディアは次のように述べています。

「プログラミングでは、asynchronousイベントは、メインプログラムフローとは独立して発生するイベントです。非同期アクションは、非同期アクションで実行されるアクションです。ブロッキングスキーム。メインプログラムフローが処理を続行できるようにします。」

「ノンブロッキング」であり、「メインプログラムフローが処理を継続できる」、同期されている、または「同時に発生している」ものではないでしょうか。同期という用語は「非ブロッキング」と非同期の「ブロッキング」を示唆しているようです。プログラミングに関連する場合、なぜこれらの用語が逆に使用されているように見えるのですか、それとも私が理解していない低レベルのコンピューティングと関係があるのですか?

同期AJAX呼び出しを使用する場合、次のことを行います...

$.ajax({
  url: somefile.php,
  async: false,
  success: {
    ...code that gets run on success...
  }
});

...code that gets run after the ajax-success code runs...

これにより、スクリプトの残りの部分を実行する前に実際に応答を待機します。これはブロックアクションです。では、他のプロセスと同期されていないのに、実際にはその逆であるのに、なぜこれが同期と呼ばれるのでしょうか。

29
Allen

確かに、それはこれらのケースの1つであり、Wordの本来の意味が覆され、一般的な使用法とは異なる意味を持っています。

電気通信における「同期」とは、メッセージを受信する準備ができたときに受信機が信号を送り、この信号の後でのみ送信機が送信を開始することを意味します。送信機がメッセージを処理し終えると、送信機はメッセージが終了したことを通知します。これにより、受信機は受信したメッセージを処理し、次に実行することになっていることをすべて実行できます。

これはもちろん単純化された非常に広いものですが、JSで「(a)同期」の意味がどこから来ているのかを感じることができます。

したがって、JSの同期リクエストは、実際にはプログラムのメインフローと同期されます。プログラムはサーバーに要求を送信し(「受信する準備ができました」)、メッセージを待ちます。サーバーからのメッセージの終わりは明確に定義されています(「メッセージはここで終わります-仕事をしてください」)。受信すると、JSはプログラムの実行を続行できることを認識します。

21
Mchl

同期:-各タスクが接続され、前のタスクに依存している場合

非同期:-各タスクは他のタスクから独立しています。

16

質問のコンテキストでのSynchronousは、2つの部分が互いに待機していることを意味します。
たとえば、サーバーにリクエストを送信するクライアントコードがあり、サーバーの応答が到着するまでコードの処理が続行されない場合、これはコードが同期している、つまり次の応答と同期していることを意味します。サーバー。
クライアントコードがリクエストを送信したが、レスポンスを待たずに処理を続行し、サーバーからのリクエストのレスポンスが到着すると、コード(たとえば特定のハンドラー内)が応答の場合、処理は非同期です。つまり、コアクライアントの処理はサーバーの応答と非同期です。
これらの用語は、(client-serverの例を使用して)クライアントが続行するために応答が必須である場合、同期コードを非同期に変換することができないため、dependencyの不足を意味しますその処理。

「ノンブロッキング」であり、「メインプログラムフローが処理を継続できる」、同期されている、または「同時に発生している」ものではないでしょうか。同期という用語は「非ブロッキング」と非同期の「ブロッキング」を示唆しているようです。

用語の誤った解釈。同期したのはプログラムフローではありません。同期できるかどうかに関係なく、同じプログラムの一部である可能性がある(スレッドなど)か、ない可能性があるのは異なる部分です。

9
Cratylus

同期リクエスト:リクエストは、特定のリクエストの応答を待ってから他のリクエストを実行すると、同期と呼ばれます。つまり、クライアントが同期的に呼び出しを行うと、クライアントブラウザがブロックされ、前の呼び出しに対するサーバーの応答を取得する前に、クライアントが別の呼び出しを行うことができないようになります。

非同期リクエスト:非同期コールは独立して機能します。つまり、サーバーの応答を待たずに別のコールまたはリクエストを実行します。したがって、サーバーの応答を待たずに、同時に異なる呼び出しを行うことができます。

0
iamitpkumar