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
来查看实际调用回调的时间。
让我们先看看服务器端代码。
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
来查看实际调用回调的时间。