したがって、最初と2番目の質問に答えるには:
ノンブロッキングは事実上非同期と同じです。呼び出しを行うと、後で結果が得られますが、それが行われている間は別のことができます。ブロッキングはその逆です。旅を続ける前に、電話が戻ってくるのを待ちます。
Async/Non-blocking コードは非常に素晴らしく聞こえますが、実際にそうです。しかし、警告の言葉があります。Async/Non-blocking は、携帯電話などの制約のある環境で作業する場合に最適です...限られた CPU / メモリを考慮してください。また、コードが何らかの方法で UI ウィジェットに反応する必要があるフロントエンド開発にも適しています。
非同期は、すべてのオペレーティング システムがどのように動作する必要があるかの基本です。バックグラウンドで処理が行われ、要求された処理が完了するとコードが起動されます。呼び出しが失敗すると、処理が行われていないことが通知されます。例外、または何らかのリターンコード/エラーオブジェクトによって機能します。
コードが応答に時間がかかる何かを要求した時点で、OS は他の処理で忙しくなる可能性があることを認識しています。コード - プロセス、スレッド、または同等のブロック。コードは、ネットワーク接続が確立されるのを待っている間、または HTTP 要求からの応答を待っている間、またはファイルの読み取り/書き込みを待っている間、OS で他に何が起こっているかを完全に認識していません。すぐ。コードは、マウスのクリックを「単に」待機している可能性があります。その間実際に起こっていたのは、OS が「イベント」をシームレスに管理、スケジューリング、および反応していることでした。メモリ、I/O (キーボード、マウス、ディスク、インターネット) の管理など、OS が監視しているものです。その他のタスク、障害回復など。
オペレーティング システムはハードコアです。それらは、複雑な非同期/非ブロッキングのすべてをプログラマーから隠すのに非常に優れています。そして、ほとんどのプログラマーが今日のソフトウェアを手に入れた方法です。現在、CPU の限界に達しています。人々は、パフォーマンスを向上させるために物事を並行して行うことができると言っています。これは、非同期/非ブロッキングが非常に好ましいことのように思われることを意味します。はい、ソフトウェアが要求する場合は同意できます。
バックエンド Web サーバーを作成している場合は、慎重に進めてください。はるかに安価に水平方向にスケーリングできることを忘れないでください。ただし、Netflix / Amazon / Google / Facebook は、このルールの明らかな例外です。純粋に、使用するハードウェアが少ないほどコストがかからないためです。
非同期/非ブロック コードがバックエンド システムにとって悪夢である理由を説明します....
1) それは生産性に対するサービス拒否になります...もっと多くのことを考えなければならず、途中で多くの間違いを犯します。
2) リアクティブ コードのスタック トレースが解読不能になる - 何が、いつ、なぜ、どのように呼び出されたかを知るのは困難です。デバッグ頑張ってください。
3) 物事がどのように失敗するかについてもっと考えなければならない。古い世界では、一度に 1 つのことを行いました。
4) テストが難しくなります。
5) 維持するのが難しい。
6) 痛いです。プログラミングは喜びと楽しさであるべきです。マゾヒストだけが苦痛を好む。並行/リアクティブ フレームワークを作成する人はサディストです。
はい、同期と非同期の両方を書きました。バックエンド アプリケーションの 99.99 がこのパラダイムでうまくいくので、私は同期を好みます。フロントエンド アプリにはリアクティブ コードが必要であることは間違いありません。
はい、コードは非同期、ノンブロッキング、およびイベントベースにすることができます。
プログラミングで最も重要なことは、コードが動作し、許容できる時間内に応答することを確認することです。その重要な原則に固執すれば、間違いはありません。