nodejs如何处理非常快的事件



我有一个nodejs进程,它有4个不同的websocket,每个websocket每秒推送1000个事件。对于每个事件,我都调用一个异步函数来详细描述它

nodejs是在每次事件到达时并行执行该函数,还是等待执行来处理下一个事件?

async function callHttp(data){
await http.get...
}
socket.on('event1', async (data) => {
await callHttp(data)
});
socket.on('event2', async (data) => {
await callHttp(data)
});
socket.on('event3', async (data) => {
await callHttp(data)
});
socket.on('event4', async (data) => {
await callHttp(data)
});

如果我用承诺来改变等待,那么,它会改变什么吗?

nodejs是在每次事件到达时并行执行这个函数,还是等待执行来处理下一个事件?

如果此代码接收到快速传入事件,它将不会等待第一个事件的执行完成,然后再开始下一个事件。一旦第一个事件命中await或返回,并且队列中有事件等待处理,则下一个事件将激发。

await不会阻止解释器返回事件循环并处理更多事件。因此,一旦代码到达await,解释器就会暂停该函数的执行,并从中返回promise(所有async函数都是这样做的(,一旦调用代码返回,它就会返回事件循环,查看是否还有更多传入事件要处理。如果是,它从事件队列中获取下一个并开始处理它

这将导致所有callHttp(data)功能并行运行,同时运行。

这是一个例子,说明Javascript中的I/O和await都是非阻塞的。解释器可以在异步I/O调用或await期间自由处理其他传入事件。

如果我用.更改了promise中的等待,那么它会改变什么吗?

否。这里没有任何变化。


如果您需要序列化这些事件的处理,以便在event1完成之前不处理event2,那么您可能必须实现自己的队列,以便当event2到达时,检查您是否已经在处理另一个事件,如果已经,则只需将event2插入队列即可。然后,当任何事件完成其进程时,它会通知队列,以便队列可以运行行中的下一个事件。但是,在这一点上,我建议对您试图实现的目标以及当前如何实现的总体设计进行更自上而下的审查,因为如果您强制服务器序列化所有这些操作,设计中可能会有一些不太理想的地方。

最新更新