并发性如何在nodejs中运行?

时间:2015-04-30 20:18:26

标签: node.js multithreading concurrency

我试图了解并发如何在像nodejs这样的单线程环境中工作。

我们说我有这段代码:

var fs = require('fs');

fs.readFile('file1', function one(err, data) {
  // some code...
});

fs.readFile('/file2', function two(err, data) {
  // some code...
});

现在每个fs.readFile调用都是异步的。所以,它们同时运行。但如果所有这一切都发生在一个线程中,那么并发性是如何实现的呢? function onefunction two是否在相同或不同的主题上运行?

基本上,node.js如何处理并发?

3 个答案:

答案 0 :(得分:8)

就Node而言,只有一个线程。异步调用被放入事件队列中,并且只在下一个时钟运行。

对于Node传递给C ++的代码,所有的赌注都是关闭的。那里可能有也可能没有线程。但它并没有真正影响你。

对我来说最有效的解释是"What the heck is the event loop anyway?" by Philip Roberts因为他展示的慢动作可视化工具使得一切都很清楚(无论如何)。

您可以在线试用菲利普的工具Loupe

答案 1 :(得分:3)

node.js的一点是所有内容并发运行,但代码除外。

那么,这意味着实际上有很多线程在node.js虚拟机(或者你想要的线程池)中运行,并且每当你调用异步函数时都会使用这些线程,比如执行i / o操作文件,访问数据库,请求网址等

但是,对于您的代码,只有一个线程,它处理来自event queue的事件。因此,当您注册回调时,它的引用实际上会传递给后台工作线程,一旦异步操作完成,新事件就会被添加到具有该回调的事件队列中。

答案 2 :(得分:3)

Node.js确实使用多个线程来处理io用户的封面,但这对用户是隐藏的。应用程序环境(即您的代码)只能访问单个线程,但Node.js透明地将io移交给单独的线程,而无需用户处理它。

在您的情况下,函数1和函数2都在同一个线程中运行,但读取文件数据的实际io操作是在不同的线程中执行的。

可以找到Node.js的线程/ io模型的更详细描述here,可以读取一组很好的类似示例here