Events 可能通过EventEmitter锁定Node.js中的事件循环
假设以下场景:Events 可能通过EventEmitter锁定Node.js中的事件循环,events,node.js,asynchronous,blocking,eventemitter,Events,Node.js,Asynchronous,Blocking,Eventemitter,假设以下场景: //Where "e" is a global object in the app e = new EventEmitter; ... //at some place in the app code I'm adding Listener 1 e.on('myEvent', function() {console.log('Listener 1)}); ... //at another place in the app code I'm adding
//Where "e" is a global object in the app
e = new EventEmitter;
...
//at some place in the app code I'm adding Listener 1
e.on('myEvent', function() {console.log('Listener 1)});
...
//at another place in the app code I'm adding Listener 2
e.on('myEvent', function() {console.log('Listener 2)});
...
//at another place in the app code I'm adding Listener N
e.on('myEvent', function() {console.log('Listener N)});
...
//finally in some place I'm emitting "myEvent"
e.emit('myEvent', p1, p2);
在执行“e.emit('myEvent',p1,p2)”时,由我的代码控制节点主线程(而不是事件循环)。“emit”函数是一个同步函数,因此“emit”此时正在调用连接到“myEvent”的每个侦听器(在上面的示例中为N个侦听器)。因此,实际上,调用“e.emit('myEvent',p1,p2)”相当于在传统的命令式范例中进行以下调用:
Listener1(p1,p2);
Listener2(p1,p2);
...
ListenerN(p1,p2);
如果N很大,我就阻塞事件循环,因为控制主线程的是我当前的代码,而不是事件循环
这种情况是真实和可能的吗?是否出于这个原因,默认情况下Node.js最多有10个侦听器
提前谢谢 由于Javascript(无需手动创建子进程)是单线程的,所以在代码中执行的所有操作都意味着它是按顺序执行的。语言本身是同步的。在使用EventEmitter添加监听器的情况下,在添加监听器时,它仍然会一个接一个地执行所有内容。可以使用一组手动事件发射阻塞节点,但这与使用while(true)
循环相同,这将产生类似的结果。EventEmitter就在这里,只是为了能够使用与内置模块相同的模式。大致相当于EventEmitter的是:
var handlers = [];
function addHandler(fn) {
handlers.push(fn);
}
function emit() {
for (var i = 0; i < handlers.length; i++) {
handlers[i]();
}
}
// Add a bunch of handlers
addHandler(function(){console.log('foobar 1');});
....
addHandler(function(){console.log('foobar N');});
// Fire the event
emit();
var处理程序=[];
函数addHandler(fn){
推(fn);
}
函数emit(){
对于(var i=0;i
异步部分是操作系统和节点的组合,它使您能够将文件读取、缓冲等任务委托给操作系统本身,而操作系统本身基本上是在另一个线程中完成的,节点可以自由运行事件循环。当操作系统向节点触发一个文件读取完成的事件时,它会执行您在JS中编写的必要修改。在运行已完成文件读取的处理程序时,整个事件循环仍然停止,因为任何时候都有一个JS执行实例
从:
默认情况下,如果超过10,EventEmitter将打印警告
侦听器被添加到其中。这是一个有用的默认值,有助于
查找内存泄漏。显然,并非所有的发射器都应限于
十,
希望它至少澄清了一些事情