【问题标题】:Do callback functions block the main thread when using socket.io?使用 socket.io 时回调函数会阻塞主线程吗?
【发布时间】:2018-09-04 15:02:11
【问题描述】:

我正在尝试在 node.js 中构建我的服务器。我正在使用 socket.io。

类似的东西:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
    console.log('a user connected');
    socket.on('disconnect', function(){
      console.log('user disconnected');
    });
  });

http.listen(3000, function(){
  console.log('listening on *:3000');
});

我知道 node.js 中的 IO 是异步的,但是如果我在“连接”中调用一个函数,比如读取文件,它仍然是异步的还是会阻塞主线程?我不确定,我的理解是,在异步 IO 中调用的所有内容也是异步运行的,不会阻塞主线程。

【问题讨论】:

  • 我知道node.js中的IO是异步的你为什么会知道这个?您必须显式调用所需的 I/O 方法的异步版本。这不是自动的。
  • 它仍然在单个“主”线程上运行(并且会阻塞它) - 它只是在 稍后 运行(这就是 asynchrony 的意思) .
  • 那么是否有可能编写一个可以处理大量流量的优秀 node.js 服务器?举个例子,一次有 1000 个用户请求?
  • @Olli — 是的。只是不要进行昂贵的阻塞操作(如同步文件系统访问)。

标签: javascript node.js callback socket.io


【解决方案1】:

异步代码是稍后运行而不是在等待某事时阻塞的代码。

连接事件处理程序是异步的。它在事件发生之前不会运行(因此在等待事件发生时它不会阻塞其他所有内容)。

您调用的函数将像任何其他函数一样被调用。它在运行时会阻塞。如果它是一个异步函数,它将停止运行并等待它正在等待的任何内容,而不会阻塞。

例如

readFileSync 将在读取文件时阻塞(在您调用它之前它不会阻塞,直到事件发生时才会发生)。

readFile 不会阻塞,至少不会以显着的方式阻塞。它将在设置文件读取时占用主线程,然后休眠(不阻塞)直到文件数据可用,此时它将再次唤醒并将结果传递给回调。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2016-10-19
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多