在 express 的路由那,
app.get('/index’, function(req,res){res.send(‘aa’)}); app.get('/list’, function(req,res){ var startTime = new Date().getTime(); while (new Date().getTime() < startTime + 10000); //实际上面这代码,是一段 cpu 密集型的操作,可能花几秒 res.send(‘bb’); });
当我先访问/ list ,再访问 /index,输出的aa 要等10秒 bb 输出后才输出。
express没有处理线程阻塞的东西么?如果这个要自己处理,那么代码应该怎么改呢?
node是单线程的,当遇到cpu密集操作的时候会造成下面的代码不会执行或者服务器假死的情况,你可以让c++封装那些cpu密集操作给js的api让开发者调用,或者用node提供的异步机制来处理 推荐用process.nextTick 在下一个事件循环中执行 process.nextTick( function () {
while (new Date().getTime() < startTime + 10000); } ) res.send(‘xxoo’);
一下这段话来自nodejs 官网,由坛子里大牛翻译的 0.10.X版本后用setImmediate 会好点
在0.8以及之前, process.nextTick() 会在当前事件循环结束时调用,这样通常是会在I/O开始前被调用的。所以很多项目都会使用process.nextTick()让它晚点做,而在I/O之前,看上去这样是正确的。事实上在大负载的I/O情况下,nextTick可能工作不正常,出现线程竞争情况。所以在v0.10.0版本 process.nextTick() 会在js代码执行完成后调用,而不是写入事件循环,可以说变同步了。应该尽量避免使用 process.nextTick() 来做递归,如果非要这么做请使用 setImmediate 来代替。