我试图了解并发如何在像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 one
和function two
是否在相同或不同的主题上运行?
基本上,node.js如何处理并发?
答案 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)