web-dev-qa-db-ja.com

非同期と同期の意味

コンピュータサイエンスにおけるasynchronousおよびsynchronousの意味は何ですか?

あなたが言葉の意味をググるとあなたは以下を得るでしょう:

しかし、それらはプログラミングやコンピュータサイエンスで反対の意味を伝えるために使用されているようです。

HTML非同期属性 は、HTMLがまだ解析またはダウンロードされている場合でも、ダウンロードされるとすぐにスクリプトが実行されることを意味します。つまり、スクリプトとHTMLの両方のプロセスが存在し、同時に発生します。私に時間。

これらの用語はコンピュータサイエンスで反対の意味を伝えるために使用されているのですか、それとも私は要点を逃していますか?

47

あなたが見つけたそれらの定義に直接関連する答えをあなたに与えたいと思います。 1つのタスクT1が2番目のタスクT2を開始すると、次のように発生します。

同期:既存または同時に発生。

したがって、T2の起動と実行は保証されていますT1のタイムスライス内。 T1はT2の終了を「待機」し、その後処理を続行できます。この意味で、T1とT2は「同時に」(「並行して」ではなく、連続した時間間隔で)発生します。

非同期:存在しないか、同時に発生していません。

したがって、T2の実行時間はT1とは無関係になりました。これは並列に実行され、1秒、1分、または数時間後に発生し、T1が終了してもT2が実行される場合があります(T2の結果を処理するには、新しいタスクT3が必要になる場合があります)。この意味で、T1とT2は「同時に発生(間隔)」していません。

もちろん、同意します。最近の非同期操作が並列実行の作成によく使用されることを考えると、文字どおりの定義があいまいなようです。

48
Doc Brown

それを理解する最善の方法は次のとおりです。

  • 同期:いつ発生するかはわかっています(この他のコードが終了すると発生します)。
  • 非同期:いつ発生するかわかりません。

注:コードを特定のクロック時間で実行するようにスケジュールすることはできますが、実際にはいつ発生するかわかりません。システムクロックの乱れを無視しても、システムが他のことをしているためビジー状態になるためです。さらに、特定の時刻に正確に発生することが保証されていたとしても、その時点でプログラムがどこで実行されるかはわかりません。したがって、時刻にスケジュールされたコードは同期していません。


ソフトウェア開発では、たとえば、タスクは独立したタスクについての非同期のタスクであることに注意してください。ただし、同時に発生するかどうかという観点から定義する場合は、タスクと比較するために少なくとも何か他のものが必要です。

多くのプラットフォームは、並列処理とタスク切り替えの両方を実行できます。一部は並列​​処理が制限されており、一部は並列​​処理を実行できず、タスク切り替えのみに依存しています...さらに、一部のプラットフォームはタスクを中断できず、別のプラットフォームを実行する前に完了する必要があります...非同期タスクはこれらすべてを抽象化したものであり、システムは、開発者がそれを心配することなく(特定のプラットフォームに対して)タスクを実行する方法を決定できます。

また、外部入力を非同期タスクとして概念化でき、通常は抽象化して取得できることにも注意してください。たとえば、ユーザー入力からテキストを取得します。 ユーザーがいつ入力するかわかりません。これは、永続的なストレージからの読み取り、ネットワーク経由のデータの取得、またはその他の外部システムにも適用されます。


ちなみに、基本的に非同期であるものもありますが、通常はそうではないふりをすることができます。それが完了するまで、ソフトウェアに現在の実行をブロックさせ、それ以外には何も行わないことで、それを実現します。つまり、非同期のものを取得し、それを同期APIでラップできます。

非同期APIを使用すると、要求された操作が完了していなくても実行を継続できますが、同期操作はできません。そしてそこから、非同期で(ソフトウェアで)アイデアが同時に発生することを意味します(同時)。

非同期は同時実行を意味しないことに注意してください。場合によっては、プラットフォームは、現在のタスクが完了した後にのみ非同期タスクを実行できます。これは逐次的です(ただし、非同期タスクの実行順序は必ずしも保証されません)、同時ではありません(実行期間に重複はありません)が、非同期です。

ところで、一部のプラットフォームでは、システムが非同期タスクをインライン化することを決定し、同期操作としてその場所で実行することができます(可能な場合は、すべてのタスクで実行可能ではありません)。

繰り返しになりますが、非同期とは、いつ発生するかわからないということです。


「同時実行」と「並列」実行の違いは? にも興味があるかもしれません。

20
Theraot

非同期:存在しないか、同時に発生していません。

同期:既存または同時に発生。

Async属性は、HTMLがまだ解析されている場合でも、ダウンロードされるとすぐにスクリプトが実行されることを意味します。つまり、両方のプロセスが同時に存在します。

これは確かに混乱します!

代わりに、synchronizedおよびunsynchronizedの意味を検討してください。 2つの要素は、一方のタイミングが他方に依存する場合はsynchronizedであり、タイミングが無関係の場合はunsynchronizedです。

非同期ワークフローの例では、スクリプトの実行とHTML解析の2つの処理が行われています。これら2つはunsynchronized;です。実行操作のタイミングと解析操作のタイミングは互いに依存しません。ワークフローをsynchronousにすると、操作はsynchronizedになります。たとえば、解析が確実に終了するまで、実行は開始されません。

ただし、実際には次の3つの可能性があることを認識することが重要です。

  • 実行と解析は完全に非同期です。どちらもいつでも、どの順序でも発生する可能性があり、最も効率的です。
  • 実行と解析は同期されます。たとえば、I/Oが完了するのを待っている間、CPUは何もしません
  • 実行と解析は同期していますが、I/Oが完了するのを待っている間、CPUは他の作業を実行することが許可され、ダウンロードが完了した後で戻って解析を実行します

これを理解すると、一般的なプログラミング言語での非同期ワークフローの目的がより明確になります。

  • 非同期ワークフローを使用すると、関連性のないものを時間どおりに注文する必要がないため、待ち時間の長い操作を効率的に実装できます。解析が高レイテンシでI/Oバウンドであり、スクリプト実行が高レイテンシでCPUバウンドである場合、これらの操作を完全または部分的に非同期化することで効果を得ることができます。

  • C#などの言語のawait演算子は、非同期ワークフローの順序付け演算です。待機は非同期待機です。これは、非同期ワークフローの2つの部分間の順序関係を表すポイントであり、待機前のコードとコードの間にがある「前に発生する」関係があると言います(= /// =)待った後。 これは3番目のオプションを実装する方法です

それがあまりに抽象的な場合は、いくつかの実際の例を考えてください。レターを送信するとき-待ち時間の長いI/Oバウンド操作-は、レターへの返信を待つ間、CPUを集中的に使用する作業(数学の宿題など)を行うことができます。数学の宿題をしてメールを読む操作は同期されていません。

しかし、今あなたが手紙を送り、返信にあなたがあなたの税金を行うために必要な数が含まれているとしましょう。これで、I/O操作が完了するまで、CPU作業(税金の計算)を行うことができなくなります。 しかし、待っている間でも芝生を刈ることができます。これは、パーツ間のタイミング関係を表現した非同期ワークフローです。

13
Eric Lippert

私は電気技師で、論理回路(論理ゲート)で同期対非同期を扱いました。

2つの入力と1つの出力を持つANDゲート(または任意のゲート)があるとします。

非同期の場合、入力のいずれかが変化して出力が変化する瞬間に、出力が更新されます。これがあなたの例がどのように機能したかです-あなたが言及したプログラム。

ただし、そのゲートにもクロック(たとえば、1秒周期の方形波)が接続されており、1秒ごとのビートで更新される場合、方形波がローからハイに変化するときに同期します。それはクロックの周波数にバインドされています。したがって、同期です。そのクロックを多くの回路に配線すると、それらは互いに同期して動作します-同期されます。プログラムが毎秒実行するために読み取られたかどうかのみをチェックした場合、プログラムも同期されます。

6
DrOnline

具体的な例

実際の例をいくつか追加して、ソフトウェアエンジニアリングの世界につなげたいと思います。最初に、私があなたの「同期」の直感的な定義に一致することを期待しているものを考えてみましょう:状況によっては ホタルの点滅 です。次に、4x100女子オリンピックリレー race について考えてみましょう。第三に、軍事映画からの古いロープを考慮してください:「男性、時計を同期させてください!」

さて、何が起こっているのか考えてみましょう。これらすべてがプロセス、またはエンティティ時間の延長であることを確認することから始めましょう。ボウルが「同期」でロックが「非同期」であると言っても意味がありません。次に、タンゴに2つ必要です。 「ランナーは同期している」とは言えません。何と同期しますか?最後に、2つのプロセスが同時に何かを行うためには、それらがすでに同じ周波数とフェーズを持っている場合を除き、1つまたは両方が待機する必要がありますです。

分析

辞書の定義で2つのエンティティが同期して「同時に発生または存在する」と記述されている場合、それはホタルからの光の概念と非常によく一致しています。残念ながら、ライトが「同期している」と言うのは、ホタルの照明プロセスが同期していると言ってずさんな方法です。

では、おそらくApple SmartWatchとNTPそれらをガイドするために持っていない)のホタルの束がどうやって同時に後端をフラッシュするのかええと、一貫したテンポを設定する手段があり、それに微調整を加えることができれば非常に簡単です。点滅するだけで、直後に点滅する人が増えると、速度が遅くなり(遅延が長くなります)、直前にスピードを上げます(遅延を減らします)。シンプルなフィードバックプロセスを使用して、基本的に同じテンポとフェーズに到達できます。ここで重要なのは、同期をとることに注意することです点滅する適切な瞬間

両方プロセスタイミングの動作が表示されているため、4x100レースは興味深いものです。ランナーwithinチームが同期され、ランナー別のチーム =は「非同期」です。リレーの2番目のランナーは、最初のランナー転送ゾーンに入るになるまで待機する必要があります。ハンドオフは、これら2つのランナー間の同期イベントです。ただし、異なるレーンのランナー別のレーンで何が起こっているかは気にしないであり、ほとんどの場合、スローダウンせず、ハンドオフを同期して行いません。ランナーの各レーンは、互いに非同期です。この場合も、同期には待機が必要ですが、非同期にはそうではありません。

最後に、会社の兵士(小隊、消防隊など)は、敵を攻撃できるように時計を同期する必要があります同時に。一部の兵士が他の兵士より先に彼らの位置に到着するか、またはより早く敵に発砲する機会があるかもしれません。しかし、同時攻撃は、意外な要素があるため、無計画な攻撃よりも効果的です。したがって、同期を達成するために、兵士の多くは待機が指定された時間に行動する必要があります。

フィーチャーの定義

なぜこれが待機に重点を置いているのですか?まあ、それは、待機が同期プロセスと非同期プロセスを区別する定義機能であるためです。何も知らない2つのプロセスがある場合、デフォルトでは、それらは非同期であると想定する必要があります。たとえば、荷物の配達と救急車が運転する可能性が最も高いnot同期されます。 2つのプロセスが実際に同期化されていることを示すために、非常に特別な瞬間を見つける必要があります:同期化ポイント

荷物を降ろした配達員と病院に誰かを急いで運ぶ救急車は、通常、「同期ポイント」として特定する時点を共有しません。一方、一斉に点滅するホタルは点滅するたびに同期ポイントがあり、リレーランナーはバトンを渡すたびに同期ポイントがあり、兵士が攻撃を開始すると同期ポイントがあります。 1つ以上の同期点を特定できる場合、プロセスはsynchronizedです。 「syn-」は ギリシャ語のプレフィックス が「with」または「一緒」を意味し、「chrono」は ギリシャ語のルート であるため、これは理解しやすいはずです。 」 「同期」とは文字通り「同時に」という意味であり、同期点の存在を識別するものと考える必要があります。

境界

「同期」は、どちらか一方または両方のプロセスの全体のライフタイムに必ずしも適用されるわけではないことに注意してください。それは「同期ポイントまでの待機時間」にのみ適用されると私は主張します。したがって、2つのプロセスは、通信する必要がある状態に到達するまで非同期で動作し、次に同期して情報を交換し、その後非同期で続行します。簡単な例は、コーヒーを飲みに誰かに会うことです。明らかに、会議は同期ポイント(またはむしろ多く)であり、2人の人がそのポイントに到着するという事実は同期を実証します。ただし、2人がコーヒーのために会ったため、その2人の人間lifetimesは「同期」しているとは言えません。それは彼らが出会った彼らの人生の唯一の瞬間であったかもしれません、そして彼らがする他のすべてはそうでなければそれ以外は独立しています。

また、偶発的な出会いが同期を示しているわけではありません。 2人の見知らぬ人が通りを通り過ぎる場合、彼らがいつか特定の場所にいるという事実は同期を証明しません。一人がバスを待っているベンチに座っていて、もう一人がたまたま通り過ぎているという事実もそうではありません。プロセスは、-目的を満たす場合にのみ同期します。

ソフトウェア接続

次に、ソフトウェアの非常に基本的なタスクであるファイルからの読み取りについて考えてみましょう。おそらくご存じのとおり、大容量記憶装置は通常、キャッシュやメインメモリより数千から数百万倍遅いです。このため、オペレーティングシステムとプログラミング言語ライブラリは通常、同期および非同期のI/O操作の両方を提供します。ここで、プログラムに単一のスレッドしかない場合でも、この説明では、OSを「個別のプロセス」と見なす必要があります。

同期

「同期I/O読み取り」を行う場合、データが利用可能になるまでスレッドはwaitになる必要があります。これはバトンを次のランナーに渡すリレーランナーに非常によく似ていますが、代わりに2人のランナーだけがトラックを一周するリレーを想像し、2番目のランナーも最初のランナーにハンドオフします。

この場合、プログラムスレッドとOS I/Oプロセスは「同時に発生」しているわけではないため、これらのプロセスが「同期」していると言うのは奇妙に思われます。しかし、それはそれを見るのに間違った方法です! 「リレーチームのランナーは同時に走っていないので、同期されていません。」実際、両方ステートメントは間違っています!リレーチームのランナーdomustは同時に実行されますが、非常に特定の瞬間、つまりバトンの引き渡し時にのみ実行されます。実際、リレーチームが最初から同期しているのは、レース中のこの特別な瞬間だけです。 I/O要求と応答を「バトン」と見なすと、I/Oのブロックが2人の女性リレーレースと本質的に同型であることが容易にわかります。

一方、スーパーコンピューターで有限要素分析のようなことを考えると、大規模なグローバル状態を更新するには、何千ものプロセスがロックステップで動作しなければならないことがわかります。一部のノードが特定のタイムステップで他のノードより先に作業を完了したとしても、結果は空間を通じて隣接ノードに伝播するため、すべてのノードがタイムステップが完了するのを待つ必要があります。この種の同期はホタルに似ています。すべてのアクターが同じ種類のタスクを実行しています。

プロセスの多様性

このため、いくつかの用語を作成して、「同種の同期」、「異種の同期」、および「順次の同期」の3種類の処理が行われていることを確認できます。したがって、アクターが同じタスク(FEA、ホタル)を同時に実行している場合、それらは「均一」です。彼らが同時に異なるタスクを実行している場合(兵士が目的地まで走る、クロールする、水泳する、ゲーム内の物理対サウンド対AIスレッド)場合、それらは「異種」です。一度に1つずつタスクを実行する場合、それらは「順次」です(リレーランナー、I/Oのブロック)。それらは非常に異なって見えるかもしれませんが、それらは1つの重要な特性を共有します。すべてのタイプのアクターは、全員が同時に同期ポイントに到着することを保証するためにいくつかの待機を実行します。アクターが「動作中」であるか、同期ポイント間で待機中であるか、または「同じアクションを実行する」かは、同期性の特性とは無関係です。

GPUのレンダリングパイプラインは、フレームをまとめて終了し、新しいフレームをまとめて開始する必要があるため、同期しています。彼らは同じ種類の仕事をしているので同質であり、それらはすべて一緒に活動しています。しかし、サーバーのメインゲームループと、リモート入力を処理するブロッキングI/Oスレッドは、非常に異なる種類の作業を行うため異種であり、一部のI/Oスレッドは何も実行しないため、すべてではありません。接続が使用されます。それでも、状態をアトミックに共有する必要があるため、同期されます(プレーヤーはゲームワールドの部分的な更新を確認したり、サーバーがプレーヤーの入力の断片のみを確認したりしてはなりません)。

非同期

ここで、「非同期I/O読み取り」について考えてみましょう。プログラムがOSにリクエストを送信して、ストレージからデータのビットを読み取ると、呼び出しすぐに戻りますになります。コールバックを無視して、ポーリングに焦点を当てましょう。一般に、データがプログラムで利用可能になった瞬間は、プログラムのスレッドに関する限り、特別な時点に対応しません。プログラムがデータを明示的に待機していない場合、スレッドはその瞬間がいつ発生するかさえ正確に知りません。データが次にチェックするときにデータが待機していることのみを検出します。

OSとプログラムスレッドがデータの引き渡しに同意する特別な会議時間はありません。彼らは夜を通過する2つの船のようなものです。非同期はこれによって特徴付けられます待機の欠如。もちろん、結局のところ、プログラムスレッドは結局I/O操作を待つことになりますが、そうである必要はありません。 I/Oフェッチが発生している間、他の計算を続けて喜んで続行し、余裕があるときにだけチェックすることができます。もちろん、OSがデータのフェッチを完了すると、待機することもありません。それは単にデータを便利な場所に置き、そのビジネスについて続けます。この場合、プログラムがバトンをOSに渡し、OSが後で動き出し、データと共にバトンを地面に落とし、トラックから降ります。プログラムは、ハンドオフを受信するために待機している場合と待機していない場合があります。

並列処理

ソフトウェアで関数を「非同期」としてマークする場合、それはたいていparallelismが必要であることを意味します。ただし、並列処理は同期を意味するものではありませんです。ホタルは良い例です。ホタルも同期と非同期の両方の振る舞いを見せたからです。ほとんどのハエは一斉に光を放ちましたが、多くのハエは他のグループと明らかに調子が外れており、よりランダムに光っていました。ハエは同時に行動するであった可能性がありますが、すべてが同期されていないでした。

ここで、一部のコードを「非同期」としてマークすると、おかしなように見えます。これは、それほどマークされていない残りのコードが「同期」であることを意味するためです。それは一体何の意味ですか? 「同期」にはタンゴに2つ必要だと私たちは主張しませんでしたか?しかし、シングルスレッドで実行されるコードについて話している場合はどうでしょうか。この場合、一歩下がって、プログラムを状態のシーケンスとそれらの状態間の遷移として考える必要があります。プログラム内のステートメントは、状態遷移を引き起こします。これは、ステートメントで開始および停止する「マイクロプロセス」と考えることができます。言語によって定義されるシーケンスポイントは、実際には、これらの「マイクロプロセス」の同期ポイントです。したがって、シングルスレッドのシリアルプログラムをsequential synchronyの例として見ることができます。

プログラミング言語の整合性は、ステートの更新がステートメント間で干渉しないことを保証し、シーケンスポイントは、コンパイラーが観察可能な最適化を行うことができない境界を定義します。たとえば、ステートメント内の式の評価順序は未定義または指定が不十分な場合があり、コンパイラーにステートメントをさまざまな方法で最適化する自由を与えます。しかし、PL自体が健全であれば、次のステートメントが始まるまでに、プログラムは明確に定義された状態になっているはずです。

これで、「非同期」の意味が明確になります。これは、コードブロック内の同期の暗黙のコントラクトが非同期ブロックに対して免除されることを正確に意味します。プログラムの状態を個別に更新できますが、通常は逐次(一貫した同期)計算モデルによって示唆される安全性の保証はありません。もちろん、これは、プログラムの状態を矛盾しないように破壊しないように、特別な注意を払う必要があることを意味します。これは通常、限定されたexplicit同期を導入して非同期ブロックと調整することを意味します。これは、非同期ブロックが両方とも非同期である可能性があることを意味することに注意してくださいおよび異なる時間に同期!しかし、同期は単に同期点の存在を示しているだけであることを思い出してください。この概念を受け入れることは問題ありません。

3
Lawnmower Man

地球を周回する2つの衛星を想像してみてください。

  • 衛星Aは地球の周りに回転の周期があるので、惑星が完全に回転するたびに、衛星は地球の周りを回っています1回以上または以下
  • 衛星Bは地球の周りに回転の周期があるため、惑星が完全に回転するたびに、衛星は地球の周りを一周します正確に1回

上記の例の衛星Bは、次のように定義される静止軌道にあります。

地球の自転の周期と同期する自転の周期を持っている。

衛星Aが地球と「同時に存在するか同時に発生する」という理由だけで衛星Aが静止していると主張する人はいない。実際、衛星B自体も関連するものではありません。関連するのは、地球の回転周期と同期している回転周期です。オブジェクトの同時存在についてではありません。それはオブジェクト間の関係についてです。この考えを保持します。

システム上で2つのスレッドが同時に実行されていると言ったとします。スレッドA(TA)はプロセスAのデータをフェッチし、スレッドB(TB)はプロセスBのデータをフェッチしています。「TAとTB非同期ですか? "と尋ねます。応答は次のようになります。 、「どうやって知ることができますか?それぞれのプロセスでそれらを呼び出したコードを確認する必要があります。」トリッキーになるために私が言いたいのは、「しかしTAとTBは確実に同時に実行されています。」

そして、あなたは、かなり賢い個人であり、「繰り返します-彼らは実行されているかもしれません同時にしかし、彼らが実行されているかどうかは私にはわかりません非同期的にそれぞれのプロセスに関してTAとTB非同期で実行されているお互いは、それらから起動されなかったため、実際には意味がありません同じプロセスです。」

したがって、今では、これらの2つのスレッド自体の存在だけでなく、関係の存在がここで関連するものであるという直観が得られるはずです。メソッドが非同期で実行される場合、そのメソッドの実行は、「[〜#〜] not [〜#〜]が同時に存在するか、発生する必要がある」ということです。それを呼び出したメソッドの実行次の例を見てください。

_func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}
_

以前の衛星の議論から、「それは物体の同時存在についてではなく、物体間の関係についてです」。それは呼び出しメソッドと呼び出されたメソッドの存在についてではありません。それは、インボーカーの実行と呼び出された実行の間の関係の存在についてです。システムスレッドを調べて、DoThatAsync()が呼び出されたが実行されていないことがわかった場合、それはスケジューラまたは他のI/Oで待機している可能性がありますが、これは必ずしも呼び出しメソッドInvoker()が実行されていません-実行可能な作業があります。確かに、それはawaiting DoThatAsync()の時点にある可能性がありますが、保証されていません。いったん呼び出されると、これは他の関数には当てはまりません-それらが停止した場合、何があってもInvoker()は停止します。これは保証されています。 Invoker()と呼び出された同期メソッドの間の実行は、「存在するか、同時に発生します」。

2
8protons

それについて考える1つの方法は [〜#〜] avx [〜#〜] のような [〜#〜] simd [〜#〜] 命令です。以下に、それらの使用方法のいくつかの を示します。

同期SIMD命令では、複数のデータに対して単一の命令を操作することにより、同じスレッドで正確に同時に複数の計算を実行できます。

非同期マルチスレッドでは、「おそらく」「やや」「類似」の時間で複数の計算を実行できます。

これを次の定義と組み合わせます。

synchronous 形容詞syn・chro・nous |\ˈsiŋ-krə-nəs、ˈsin-

1:正確に同時に発生、存在、または発生する[鉱山を強調]

asynchronous 形容詞asyn・chro・nous | \(ˌ)ā-ˈsiŋ-krə-nəs、-ˈsin- \

1:[...]:同期していません

1
Peter

「同期」とは、2つのイベントが同時に発生することを意味しますが、()イベントですか?

「同期実行」とは、呼び出し元と呼び出し先が同時に実行されている(スタック上で)ことを意味します。それはおそらくあなたが求めている意味です。

「同期論理ゲート」とは、論理ゲートがCPUクロックと同期していることを意味します。

分散システムのコンテキストで「同期モデル」とは、すべてのノードがロックステップでプログラムを実行し、ステップnで送信されたメッセージがステップn + 1の先頭に到着することが保証されていることを意味します。

Java言語仕様で、スレッドが別のスレッドと「同期する」と述べられている場合、異なるスレッドのアクションが(同時に発生する関係に関して)「同時に」発生することを意味します。また、2つのスレッドが「オブジェクトへのアクセスを同期する」と言うとき、それらは実際には、スレッドが互いに同期して、それらがオブジェクトに対して同時にnever動作することを保証することを意味します。

...そして、「同時に発生すること」は非常に一般的なアイデアであるため、Wordをさらに多くのコンテキストに適用できると確信しています:-)

1
meriton

SyncとAsyncとマルチスレッドの違いを理解させたアナロジーは、キッチンの料理人のそれです。

あなたがパスタを作っていると想像してください。 3つのステップがあります。

  1. パスタを茹でて水気を切る
  2. ソースを用意する
  3. パスタとソースを組み合わせる

同期メソッド。同期シナリオでは、1人(スレッド)だけがすべての作業を順番に実行します。最初にパスタを沸騰させますそしてあなたはそれが沸騰しているのを見ながらそこに立ちます。次にそれを水切りして脇に置きます。次に、ソースを準備します。ソースの準備ができたら、パスタを取り、ソースと混ぜ合わせて料理を完成させます。ここでの問題は、効率が悪いことです。同期して連続して作業していたため、パスタが沸騰している間はソースを操作できませんでした。だから、時間を無駄にして、パスタが準備されている間にパスタが冷えてしまいました。

非同期メソッド。このシナリオでは、料理人(スレッド)はまだ1人しかいませんが、パスタが沸騰している間に、ソースを作ります。パスタがゆでるとcalled-backソースを作って水気を切ってから、あなたはcalled-backもう一度ソースを仕上げます。時間を節約でき、パスタはソースをそれほど長く待つ必要がなかったので、これは今より効率的です。

マルチスレッド方式。ここで、新しいコックを雇うことを想像してください。これで2つのコック(スレッド)ができました。 1人のコックがパスタを作っている間、2人目のコックがソースを作ります。このシナリオでは必要ですか?いいえ、パスタを作るのは非同期方法で効率的であるのに十分簡単なので。また、複数のクックの管理は追加のオーバーヘッドです。しかし、より複雑な料理や一度に多くの料理を作る場合は、複数の料理人が役に立ちます。

1
bobek

良い質問であり、混乱を招くさまざまな方法でよく使用される用語。

私の答えは、これらの用語は相対的であり、それらが相対的であるのは、実行中のメインプログラム(または場合によってはスレッド)です。

これらの用語は、メッセージがブロックされる方法(同期)または非ブロックされる方法(非同期)で送信または受信されるかどうかに関して、プログラムの内部操作とタイミングについて何かを指定します。 (メイン)スレッドが送信または受信によってブロックされている場合、それは「同期」であり、なんらかの割り込みが可能な場合は、「非同期」です。繰り返しますが、これらの用語は、(通常の)動作とイベントの処理の両方を実行する実装に関するものです。

(もちろん、IMHO)メッセージが送信されると、同期と非同期のようなものはありません。メッセージングには送信者と受信者があり、それぞれが互いに独立した同期または非同期の実装を持つことができます。ただし、いったんメッセージが送信されると、それは単なるメッセージであり、同期または非同期ではなくなります。メッセージを要求または応答または一方向メッセージとして分類する場合がありますが、それは同期および非同期と直交しています(これは、実装が待機をブロックしているか、何らかの方法で中断できるかどうかを示します)。

0
Erik Eidt

私はあなたの混乱の鍵は次のように要約できると思います:

Async属性は、スクリプトがダウンロードされるとすぐに実行されることを意味しますhtmlがまだ解析されている場合でも

理解すべきことは、この文は不可能な状況を説明しているため意味がないということです。 HTMLがまだ解析中の場合、スクリプトのダウンロードプロセスは開始されません非同期の場合。

プログラミングでは、同期とは次のことを意味します。

ロジックの実行時に、関心のあるすべてのデータがすでにメモリに存在している

非同期とは:

関心のあるデータの一部はまだ存在せず、将来のある時点でのみ存在します

実際、非同期プログラミングの現在ではない側面が、通常、人々を混乱させます。

スクリプトがどのように通常ロードされるかは、HTML解析が一時停止され、スクリプトがダウンロードされ、スクリプトのダウンロードが完了すると実行され、HTML解析が続行されます。 HTMLの解析とスクリプトの実行は、「同時」に発生します(同時とは、同時ではなく一緒に意味します)。

どのようにasyncスクリプトがロードされるかは、htmlがスクリプトタグを参照し、スクリプトをfutureでダウンロードすることを覚えていますが、解析を続けます。 HTML解析は、スクリプトのダウンロードのために一時停止されません。 後で、html解析が完了した後、すべての非同期スクリプトがダウンロードされて実行されます。 HTMLの解析とスクリプトの実行は同時には行われません(ここでも、同時に意味します。この場合、これらは別々に実行されます)。

要約すると:

  • 同期スクリプトは、htmlと共に解析されます。

  • 非同期スクリプトは、今後個別に解析されます。

したがって、asyncプロパティの定義は、スクリプトがダウンロードされるとすぐに実行されるということではありません。これは、同期スクリプトと非同期スクリプトの両方に当てはまります。 asyncの定義はhtml解析はスクリプトがダウンロードされるのを待ちませんです。

0
slebetman