イベントベース==非同期ですか?

「イベントベース」は「非同期」と同じですか?

4

3 答え

いいえ、イベントが非同期であることを意味しません。

イベントドリブンのシングルスレッドシステムでは、イベントを発生させることができますが、それらはすべてシリアルで処理されます。処理の一部として返されることもありますが、同時に発生するものは何も起こりません。処理が中断された場合は、再び処理を開始するためにメッセージが送信されるまで待つ必要があります。

例としては、Swing(Java)、Twisted(Python)、Node.js(JavaScript)、EventMachine(Ruby)

これらの例はすべてイベント駆動型のメッセージループですが、すべてがシングルスレッドであり、すべてのイベントが同じスレッド上のすべての後続のイベントをブロックします。

プログラミングでは、非同期イベントはメインプログラムフローとは独立して発生するイベントです。非同期アクションは、ノンブロッキングスキームで実行されるアクションで、メインプログラムフローの処理を続行できます。

So just because something is event driven doesn't make it asynchronous, and just because something is asynchronous doesn't make it event driven either; much less concurrent.

9
追加された
Node.jsフロントページの@nickb "ノードは、RubyのイベントマシンやPythonのTwistedなどのシステムと同様の設計であり、影響を受けています。マルチコアコンピュータにプログラムを拡張するために必要なスレッドはないのですか?child_process.fork()によって新しいプロセスを開始することができます。これらの他のプロセスは並行してスケジュールされます。
追加された 著者 feeling unwelcome,
私はNode.jsが実際には非同期であると思った。
追加された 著者 nickb,

それらは基本的に直交する概念です。

"イベント駆動型"とは基本的に、特定の関数呼び出しに関連付けられたコードが実行時にバインドされていることを意味します。 誰がイベントを処理するかが分からず、イベントを処理する人は、プログラムの実行中に定義された関連付けによってイベントに応答するように定義されています。典型的には、関数ポインタ、オブジェクト指向仮想メソッドなどへの参照またはポインタなど)

"非同期"は、プログラムフローが、呼び出しが実行されるのを待つ必要がないことを意味します(主に、他のスレッドまたはプロセスに実行を委譲した直後に呼び出される呼び出しで実装されます)

すべてのイベントが非同期であるわけではありません(Windowsの SendMessagePostMessage )、すべての非同期呼び出しが "イベント"によって実装される必要はありません(ただし、非同期呼び出しを実装するメカニズムは非常に一般的です)

3
追加された

非同期の1つの意味は、計算を出す時点では、答えを待つのではなく、後で答えを得るということです。その答えは、あなたには通常のコントロールフローと直交しています。

答えが得られる1つの方法は、イベントを使用することです。これらのイベントはコードでトリガーされることなく、この場合自発的に発生します。ハンドラでは、結果を処理することができます。

計算と回答は同期モードの制御フローのポイントによって接続されますが、非同期モードでは自分で接続する必要があります。たとえば、シーケンス番号などを使用します。

0
追加された