node.js - Socket.io/Ws 事件无法正常工作
问题描述
让我们先看看服务器端代码。
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 秒,但这里只有第一次 Emit 消耗 10 秒,然后每个请求都会立即执行。
请解释事件和异步等待的这种性质。
谢谢 :)
解决方案
这是因为 Node.js 是异步的。
您在客户端所做的是几乎同时发送 100000 条消息,因此 Node.js 服务器会一一接收所有这些消息,并且 Socket.io 会调用您的回调,在您的回调中您正在做的事情sleep
我假设只是一个Wrapped setTimeout
,所以这个特定的回调等待setTimeout
被执行,但是这里当 Eventloop 发挥作用时,这个等待setTimeout
其他 JS 代码的回调被执行,所以这 100000 条消息都被处理了,每个回调都等待setTimeout
. 因此,setTimeout
EventLoop 会在 10 秒后调用回调,然后执行您的代码。
如果您习惯于使用例如Java,它可能会让您感到困惑,其中每个客户端都有一个专用的进程/线程,因此sleep
会阻止整个进程的执行。
您可以在此处阅读有关事件循环的更多信息 https://nodejs.dev/learn/the-nodejs-event-loop
console.log
UPD:您可以通过在调用sleep
函数之前添加一个简单的方法来查看实际调用回调的时间。
推荐阅读
- mysql - 我怎样才能在这个 Mysql 查询上获得更好的时间结果
- javafx - 如何提高 JavaFX 中 TableView 的性能
- json - 如何在某些 github 存储库中执行唤醒命令?
- python - 使用 genfromtxt 加载数据时如何替换值
- python-3.6 - 在目录中递归查找给定文件
- angular - 以角度将数据从图像提取到文本
- python - Python,将 1d 数据投影和插值到 3d 网格(头部表面脑电图功率)
- python - Numpy 数组元素与 Float64 的比较
- javascript - 如何使用 Word API/Office JS 实现单词在拼写错误期间显示的红色曲线?
- api - Jmeter中GET请求的可变路径参数