gpt4 book ai didi

javascript - Node.js 事件循环对我来说没有意义

转载 作者:搜寻专家 更新时间:2023-10-31 23:35:35 25 4
gpt4 key购买 nike

我是 Node.js 新手。我一直在研究 Jim R. Wilson 的“Node.js the Right Way”,但我遇到了书中(以及 Node.js 本身?)中的矛盾,我无法调和我对任何数量的谷歌搜索都感到满意。

这本书和我在网上看过的其他资源中反复提到,Node.js 逐行运行回调以响应某些事件,直到完成,然后事件循环继续等待或调用下一个回调。而且因为 Node.js 是单线程的(并且没有明确地对集群模块做任何事情,也作为一个进程运行),我的理解是,最多只有 一个 block 一次执行的 JavaScript 代码数量。

我的理解正确吗?这就是矛盾(在我看来)。如果是这种情况,Node.js 怎么会如此高并发?

这里有一个直接来自书中的例子来说明我的困惑。它旨在遍历包含数千个 XML 文件的目录,并将每个文件的相关位提取到一个 JSON 文档中。

首先是解析器:

'use strict';
const
fs = require('fs'),
cheerio = require('cheerio');

module.exports = function(filename, callback) {
fs.readFile(filename, function(err, data){
if (err) { return callback(err); }
let
$ = cheerio.load(data.toString()),
collect = function(index, elem) {
return $(elem).text();
};

callback(null, {
_id: $('pgterms\\:ebook').attr('rdf:about').replace('ebooks/', ''),
title: $('dcterms\\:title').text(),
authors: $('pgterms\\:agent pgterms\\:name').map(collect),
subjects: $('[rdf\\:resource$="/LCSH"] ~ rdf\\:value').map(collect)
});
});
};

以及遍历目录结构的部分:

'use strict';
const

file = require('file'),
rdfParser = require('./lib/rdf-parser.js');

console.log('beginning directory walk');

file.walk(__dirname + '/cache', function(err, dirPath, dirs, files){
files.forEach(function(path){
rdfParser(path, function(err, doc) {
if (err) {
throw err;
} else {
console.log(doc);
}
});
});
});

如果您运行这段代码,您将收到一个错误,因为该程序耗尽了所有可用的文件描述符。这似乎表明该程序同时打开了数千个文件。

我的问题是......这怎么可能,除非事件模型和/或并发模型的行为与它们被解释的方式不同?

我敢肯定外面有人知道这一点并且可以阐明它,但目前,让我感到非常困惑!

最佳答案

Am I understanding that correctly?

是的。

How is Node.js so highly concurrent if this is the case?

不是 javascript 执行本身是并发的 - IO(和其他繁重的任务)是。当你调用一个异步函数时,它会启动任务(例如,读取一个文件)并立即返回到你所说的“运行脚本的下一行”。然而,该任务将在后台(同时)继续读取文件,一旦完成,它将把分配给它的回调放到事件循环队列中,事件循环队列将使用当时可用的数据调用它。

有关此“后台”处理的详细信息,以及 Node 实际上如何设法并行运行所有这些异步任务,请查看问题 Nodejs Event Loop .

关于javascript - Node.js 事件循环对我来说没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24985590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com