「イベントベース」は「非同期」と同じですか?
3 に答える
いいえ、イベントが非同期であることを意味するものではありません。
イベント駆動型のシングルスレッドシステムでは、イベントを発生させることができますが、それらはすべてシリアルに処理されます。処理の一部として譲歩する場合がありますが、何も起こりませんconcurrently。譲歩した場合、処理を停止し、再度メッセージが表示されるまで待機して処理を再開する必要があります。
この例としては、Swing(Java)、Twisted(Python)、Node.js(JavaScript)、EventMachine(Ruby)があります。
これらの例はすべてイベント駆動型のメッセージループですが、すべてシングルスレッドであり、すべてのイベントが同じスレッド上の後続のすべてのイベントをブロックします。
つまり、何かがevent drivenうまくいかないasynchronousからといって、そして何かがasynchronousうまくいかないからevent drivenです。はるかに少ない同時。
それらは本質的に直交する概念です。
「イベントドリブン」とは、基本的に、特定の関数呼び出しに関連付けられたコードが実行時にバインドされることを意味します(実行中に変更される可能性があります)。誰がイベントを「発生」させるかは、何がイベントを処理するかを知りません。また、誰がイベントを処理するかは、プログラムの実行中に定義された関連付けを通じてイベントに応答するように定義されます。通常、関数ポインタ、仮想メソッドを運ぶオブジェクトへの参照またはポインタなど)
「非同期」とは、プログラムフローが、呼び出しが実行されるのを待ってから先に進む必要がないことを意味します(ほとんどの場合、実行を別のスレッドまたはプロセスに委任した直後に戻る呼び出しで実装されます)。
すべてのイベントが非同期であるわけではなく(ウィンドウSendMessageを考慮してPostMessage)、すべての非同期呼び出しを「イベント」で実装する必要はありません(ただし、イベントメカニズムの使用は非同期呼び出しを実装するために非常に一般的です)
非同期の意味の1つは、計算を発行する時点で、回答を待たずに、後で回答を取得することです。答えは、通常の制御フローと直交しています。
答えが出てくる1つの方法は、イベントを使用することです。この場合、イベントは、コードによってトリガーされることなく、自然に発生します。ハンドラーでは、結果を処理できます。
計算と回答は同期モードの制御フローのポイントによって接続されますが、非同期モードでは自分で接続を行う必要があります。たとえば、シーケンス番号などを使用します。