express 怎么让线程不阻塞
发布于 10 年前 作者 zhoujiajun88 4906 次浏览 最后一次编辑是 8 年前

在 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没有处理线程阻塞的东西么?如果这个要自己处理,那么代码应该怎么改呢?

11 回复

setTimeout可以吧。

有米有具体点的代码。。。。。。

@zhoujiajun88 你要实现什么,不是很懂。

setTimeout(function(){console.log(‘1’)}, 0); console.log(‘2’);

—> 2 1

@coolicer 我那段代码不是真的直接等待,就是有一段需要大量计划的代码在那个位置。改了问题描述

@coolicer正解

cpu密集计算的最好放到异步函数中执行

@zhoujiajun88 让node.js支持多线程,试试tagg2模块,npm install tagg2,可以解决你的问题

地址: https://github.com/DoubleSpout/node-threads-a-gogo2

@zhoujiajun88

不是很明白你的想法。现在阻塞了,你改成异步操作就行了吧。

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 来代替。

大概懂的了。。。

@coolicer 用楼上说的 tagg2异步么。。

回到顶部