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将打印警告 侦听器被添加到其中。这是一个有用的默认值,有助于 查找内存泄漏。显然,并非所有的发射器都应限于 十,

希望它至少澄清了一些事情