0

我有以下代码:

var schedules = io.on('connection', function(client) {
    var schJSON = JSON.parse(fs.readFileSync(__dirname +'huge_file.json', 'utf8'));
    client.json.send(schJSON);
});

readFileSync作为一个阻塞调用,我认为当服务器正在处理一个客户端的请求时,其他客户端会排队。因此,如果读取文件大约需要 10 秒,并且我触发了与服务器的三个不同连接,那么第三个连接将需要大约 30 秒才能得到响应。

实际上,所有三个客户端几乎同时获得响应(经过 10 秒后)。这三个请求是从三台不同的机器(具有相同的外部 IP 地址)发出的。

这怎么可能?

4

1 回答 1

2

我希望流程是这样的:

  1. 第一个请求进来并阻塞读取文件。
  2. 又有两个请求进来,它们的“连接”回调排队。
  3. 初始文件读取完成,异步client.json.send调用开始发送响应。
  4. 其他两个请求的回调被调用,每个readFileSync调用都很快完成,因为文件在磁盘缓存中,然后client.json.send被调用,以便并行发送所有三个请求的响应。
  5. 所有三个请求都完成了,可能接近于同一时间,因为第 4 步非常快。
于 2013-02-27T16:06:39.257 回答