node写同一个变量的问题
发布于 11 年前 作者 simpleapples 3926 次浏览 最后一次编辑是 8 年前

用node建立一个http server,在每一个连接中都修改globaltest这个变量,在请求量很大的时候会不会出现修改同一片内存的问题?

代码如下:

var http = require('http');
var globalTest = 0;


var app = http.createServer(function (request, response){


  globalTest++;
 console.log("--" + globalTest);

 response.writeHead(200, {
   'Content-Length': 0,
   'Content-Type': 'text/plain' });
 response.end();
 
}).listen(9001);

console.log("start run server at port: 9001");
6 回复

因为node是单进程单线程运行的,每一个function都会放入node的一个消息队列,每一个函数类似一个帧,每一时刻只有一个帧在运行,并且只有当前帧运行完以后,才会进入下一帧(function)的运行(这个可以从setTimeout这个函数的解释可以理解),并不会出现类似JAVA这种多线程资源竞争引起的并发问题。 所以我认为你上述说的案例中部会请求量很大的时候不会出现修改同一片内存的问题。

再补充一下: 因为”每一个function都会放入node的一个消息队列,每一个函数类似一个帧,每一时刻只有一个帧在运行,并且只有当前帧运行完以后,才会进入下一帧(function)的运行(这个可以从setTimeout这个函数的解释可以理解)“,所以一般写NODE代码时每一个function最好不要完成的任务过多,而导致该函数执行时间过长,而导致其他function延迟执行

@lkf520kyle 补充的东西不大准确,js的运行是一个eventloop和function代码执行时间长短没关系

@snoopy 你可以去看一下setTimeout()方法的解释。如果有这样一段代码: function test () { //test函数body,假如有个代码片段需要执行5000ms以上 setTimeout(function () { console.log(‘exec’); },1000); } test函数被执行后,会在1000ms后执行并在控制台输出:exec吗? 答案是:最起码要等到6000ms以后才能输出exec,因为test和setTimeout中的匿名函数都会放入消息队列,但是eventloop先从消息队列中取出test执行,执行完5000ms以后才会再执行setTimeout中的匿名函数,我说的“函数执行时间过长,而导致其他function延迟执行”大概就是这个意思

@lkf520kyle 嗯,这个是需要6000ms,我的意思是你上面所说的每一个function不要完成任务过多不大正确,和每个function执行任务没关系,不要阻塞线程就可以了

回到顶部