nodejs 如何处理真正快速的事件

How nodejs handle really fast events

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

nodejs是在每次事件到来时并行执行这个函数,还是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)
});

如果我用 .then 更改 promise 中的 await,它会改变什么吗?

Does nodejs execute this function in parallel every time an event arrive, or nodejs will wait the execution to process the next event?

如果此代码接收到快速触发传入事件,它不会等待第一个执行完成,然后下一个开始。一旦第一个到达 await 或 return 并且队列中有事件等待处理,那么下一个事件就会触发。

await 不会阻止解释器返回事件循环并处理更多事件。因此,一旦您的代码遇到 await,解释器将暂停该函数的执行,return 来自它的承诺(这是所有 async 函数所做的)并且一旦调用代码returns,它会回到事件循环,看看是否有更多的传入事件要处理。如果是,它会从事件队列中抓取下一个并开始处理它。

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

这是 I/O 的示例,Javascript 中的 await 都是非阻塞的。解释器可以在异步 I/O 调用期间或 await.

期间自由处理其他传入事件

If I change the await in a promise with .then, does it change something?

没有。它在这里没有任何改变。


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