イベントは、非同期実行を実現するためのパラダイムの 1 つです。しかし、すべての非同期システムがイベントを使用するわけではありません。これは、これら 2 つの意味的な意味についてです - 一方は他方の超実体です。
epoll と aio は異なるメタファを使用します:
epoll はブロッキング操作です (epoll_wait()
) - 何らかのイベントが発生するまでスレッドをブロックし、そのイベントをコード内のさまざまなプロシージャ/関数/ブランチにディスパッチします。
AIO では、コールバック関数 (完了ルーチン) のアドレスをシステムに渡すと、何かが発生したときにシステムが関数を呼び出します。
AIO の問題は、コールバック関数コードがシステム スレッドなどでシステム スタック上で実行されることです。ご想像のとおり、いくつかの問題があります。
それらはまったく別のものです。
イベント ドリブン パラダイムとは、何かが発生するたびに「イベント」と呼ばれるオブジェクトがプログラムに送信されることを意味し、その「何か」が定期的にポーリングされて発生したかどうかを検出する必要はありません。その「イベント」は、同期または非同期のいずれかのアクション (つまり「ハンドラー」) を実行するために、プログラムによってトラップされる場合があります。
したがって、イベントの処理は同期または非同期のいずれかになります。たとえば、JavaScript は同期イベント システムを使用します。
非同期とは、現在の「メイン」実行ストリームとは無関係にアクションを実行できることを意味します。 できません 「平行」または「異なるスレッド」を意味します。 「非同期」アクションが実際にはメイン スレッドで実行され、その間「メイン」実行ストリームがブロックされる場合があります。したがって、「非同期」と「マルチスレッド」を混同しないでください。
技術的に言えば、非同期操作は自動的に 想定 すると言うかもしれません。 イベンティング -- 少なくとも「完了」、「障害」、または「中止/キャンセル」イベント (これらの 1 つ以上) が操作の開始者 (または基になる O/S 自体) に送信され、操作が停止したことを通知します。 .したがって、非同期は常にイベント ドリブンですが、その逆ではありません。
イベント ドリブンは、特定のシナリオでイベントが登録される単一のスレッドです。そのシナリオに直面すると、イベントが発生します。ただし、その時点でも、各イベントは順次発生します。それについて非同期は何もありません。 Node.js (ウェブサーバー) はイベントを使用して複数のリクエストを処理します。
非同期は基本的にマルチタスクです。複数のスレッドまたはプロセスを生成して、特定の機能を実行できます。これは、各スレッドが独立しており、メイン スレッドと簡単に応答する方法で対話することはほとんどないという意味で、イベント ドリブンとはまったく異なります。 Apache (ウェブサーバー) は複数のスレッドを使用して受信リクエストを処理します。