我一直在阅读很多关于事件循环的内容,我理解了提供的抽象,我可以发出I / O请求(让我们使用fs.readFile(foo.txt))并传入一个回调函数一旦指示完成文件读取的特定事件被触发就被执行。
然而,我不明白的是正在执行实际读取文件工作的功能。 Javascript是单线程的,但有两件事情同时发生:我的node.js文件和一些程序/函数的执行实际上是从硬盘驱动器读取数据。第二个函数与节点相关的位置在哪里?
答案 0 :(得分:1)
Node事件循环实际上是单线程的。当我们使用Node启动程序时,将创建事件循环的单个实例并将其放入一个线程中。
但是对于某些标准库函数调用,节点C ++端和libuv决定完全在事件循环之外进行昂贵的计算。因此它们不会阻塞主循环或事件循环。相反,它们使用称为线程池的东西,该线程池是一系列(默认情况下)四个线程,可用于运行计算密集型任务。使用线程池的只有四件事-DNS查找,fs,crypto和zlib。其他所有内容都在主线程中执行。
答案 1 :(得分:0)
“当然,在后端,有数据库访问和流程执行的线程和进程。但是,这些没有明确地暴露给您的代码,所以除了知道I / O之外你不用担心它们因为来自这些线程的结果通过事件循环返回到你的代码,所以从每个请求的角度来看,例如与数据库或其他进程的交互将是异步的。与Apache模型相比,线程和线程开销更少,因为每个连接都不需要线程;只有当你绝对肯定必须并行运行其他东西时,即使这样,管理也由Node.js处理。“通过http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/
答案 2 :(得分:-1)
就像使用setTimeout(function(){/*file reading code here*/},1000);
一样。 JavaScript可以并排执行多个操作,例如,有三个setInterval(function(){/*code to execute*/},1000);
。所以在某种程度上,JavaScript是多线程的。而对于实际读取/写入硬盘驱动器,在NodeJS中,如果您使用:
var child=require("child_process");
function put_text(file,text){
child.exec("echo "+text+">"+file);
}
function get_text(file){
//JQuery code for getting file contents here (i think)
return JQueryResults;
}
这些也可以用于使用NodeJS读取和写入硬盘驱动器。