我有一个 Express 应用程序,当解析请求到达特定路由时会使用事件发射器。当接收到请求时,将调用 emit 函数,在处理程序中运行代码。此代码大约需要 5 秒钟才能完成。当 Express 端点同时接收到 10 个或更多请求时,会发生什么?
这些事件会被放入调用堆栈中,并按照它们被放入调用堆栈的顺序完成吗?
谢谢。
status.emit('newCompletion')
我有一个 Express 应用程序,当解析请求到达特定路由时会使用事件发射器。当接收到请求时,将调用 emit 函数,在处理程序中运行代码。此代码大约需要 5 秒钟才能完成。当 Express 端点同时接收到 10 个或更多请求时,会发生什么?
这些事件会被放入调用堆栈中,并按照它们被放入调用堆栈的顺序完成吗?
谢谢。
status.emit('newCompletion')
EventEmitter事件是同步的。它们在调用.emit()
时执行。您可以将它们视为函数调用,其中调用.emit()
只是立即调用任何匹配侦听器的函数。
这些事件会被放入调用堆栈中,并按照它们被放入调用堆栈的顺序完成吗?
它们是同步执行的。您使用的措辞让我想到您认为有一些事件排队等待处理。实际上并没有。您调用.emit()
,任何该事件名称的侦听器都会立即调用(甚至在.emit()
返回之前)。
我有一个使用事件发射器来解决特定路由请求的 Express 应用程序。当接收到请求时,会调用 emit,从而在处理程序中运行代码。此代码需要大约 5 秒钟才能完成。当 Express 端点同时接收到 10 或更多请求时会发生什么?
如果五秒钟的完成时间是同步代码,则在这五秒钟内不会发生其他事情。没有其他传入请求将被处理(它们可能会在操作系统中的某个传入 TCP 队列或事件队列中等待)。因此,一个请求将运行其五秒钟的代码,通过完成其执行将控制权返回给 Node.js,然后 Node.js 将从事件队列中获取下一个事件并处理下一个请求。
如果这5秒钟的完成时间包含一些异步操作,因此它是5秒的时钟时间,但不是5秒的 CPU 时间,则情况会更加复杂。只要第一个请求触发了一个带有注册回调函数的异步操作,然后将控制权返回给 Node.js,它将从事件队列中获取下一个事件并开始运行该请求处理程序。那将一直运行,直到将控制权返回给系统。任何.emit()
在这两个请求中都是同步的,并且不会导致除执行该事件的处理程序之外的任何其他事情发生。
您可以看到.emit()
在这里是同步的,因为它先于其他任务和微任务:
let em = new EventEmitter();
em.on("hello", function() {
console.log("hello");
});
// schedule "immediate" task
setTimeout(function() {
console.log("timer");
}, 0)
// schedule "immediate" micro-task
Promise.resolve().then(function() {
console.log("promise");
});
em.emit("hello");
console.log("ready");
<script src="https://cdnjs.cloudflare.com/ajax/libs/EventEmitter/5.2.2/EventEmitter.js"></script>