4

以下は私のnodejsコードです

var emitter = require('events'),
    eventEmitter = new emitter.EventEmitter();
eventEmitter.on('data', function (result) { console.log('Im From Data'); });

eventEmitter.on('error', function (result) { console.log('Im Error'); });

require('http').createServer(function (req, res) {
    res.end('Response');
    var start = new Date().getTime();
    eventEmitter.emit('data', true);
    eventEmitter.emit('error', false);
    while(new Date().getTime() - start < 5000) {
        //Let me sleep
    }

    process.nextTick(function () {
        console.log('This is event loop');
    });
}).listen(8090);

Nodejsはシングルスレッドであり、イベントループで実行され、同じスレッドがイベントを処理します。したがって、上記のコードでは、localhost:8090ノードスレッドへのリクエストで、リクエストの処理でビジー状態を維持する必要があります[5秒間スリープします]。

同時に、eventEmitterによって発行される2つのイベントがあります。したがって、これらのイベントは両方とも、要求が処理された後の処理のためにイベントループのキューに入れられる必要があります。

しかし、それは起こっていません、私はそれらが放出されるときに同期的に提供されているイベントを見ることができます。

それは期待されていますか?期待どおりに機能する場合は、イベントモジュールを拡張する必要がないことを理解しています。しかし、eventEmitterによって発行されたイベントはどのように処理されますか?

4

1 に答える 1

8

非同期処理を必要とするものだけがイベントループにプッシュされます。ノードの標準イベントエミッターは、イベントをすぐにディスパッチします。、、、などを使用するコード、またはC ++で明示的に追加するコードのみが、ノードのライブラリなどのイベントループに影響しprocess.nextTickます。setTimeoutsetInterval

たとえば、ノードのfsライブラリをのようなものに使用createReadStreamすると、ストリームが返されますが、ファイルはバックグラウンドで開きます。開いている場合、ノードはイベントループに追加され、ループ内の関数が呼び出されると、ストリームオブジェクトで「open」イベントがトリガーされます。次に、ノードはバックグラウンドでファイルからブロックをロードし、イベントループに追加してdata、ストリームでイベントをトリガーします。

これらのイベントを5秒後に発行する場合は、ビジーループの後に呼び出しを使用setTimeoutまたは配置する必要があります。emit

また、明確にしておきたいのですが、ノードコードのようにビジーループが発生することはありません。イベントループをテストするためだけに行っているのか、それとも実際のコードの一部であるのかはわかりません。さらに情報が必要な場合は、達成しようとしている機能を拡張してください。

于 2012-05-17T15:28:40.063 に答える