Socket.io/Ws 事件无法正常工作

Socket.io/Ws Event Does Not Work Properly

让我们先看看服务器端代码。

io.on('connection', (socket) => {
     socket.on('message', async () =>{
     await sleep(10000); //This Function Takes 10s To Process
     console.log(++total)
  })
});

客户端

socket.on('connect', () => {
     console.log('connected!');
     for(var i=0;i < 100000; i++){
       socket.emit('message', 'room1');
     }
});

我想向我的服务器发送垃圾邮件。现在每个请求都应该花费 10 秒,但这里只有第一次发出会消耗 10 秒,然后每个请求都会立即执行。

请解释事件和异步等待的性质。

谢谢:)

发生这种情况是因为 Node.js 是异步的。

你在客户端所做的是几乎同时发送 100000 条消息,所以 Node.js 服务器一条一条地接收所有这些消息并 Socket.io 调用你的回调,在你的回调中你正在做的 sleep 我认为只是一个包装的 setTimeout,所以这个特定的回调等待 setTimeout 被执行,但是当 Eventloop 开始发挥作用时,这个回调等待setTimeout其他JS代码被执行,所以这100000条消息全部处理完,每个回调等待setTimeout。因此,10 秒后 setTimeout 回调将被 EventLoop 调用,然后您的代码将被执行。

如果您习惯于使用例如Java,其中每个客户端都有专用的 process/thread,因此 sleep 会阻止整个过程的执行。

您可以在此处阅读有关事件循环的更多信息https://nodejs.dev/learn/the-nodejs-event-loop

UPD:您可以通过在调用 sleep 函数之前添加一个简单的 console.log 来查看实际调用回调的时间。