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