如何在Express请求处理程序中编写非阻塞asynchronous函数

所有:

我很新的节点asynchronous编程,我不知道我怎么可以写一些快速请求处理程序,可以处理耗时繁重的计算任务无块快速处理的要求?

我认为setTimeout可以做到这一点,把工作在事件循环,但它仍然阻止其他请求:

var express = require('express'); var router = express.Router(); function heavy(callback){ setTimeout(callback, 1); } router.get('/', function(req, res, next) { var callback = function(req, res){ var loop = +req.query.loop; for(var i=0; i<loop; i++){ for(var j=0; j<loop; j++){} } res.send("finished task: "+Date.now()); }.bind(null, req, res); heavy(callback) }); 

我猜我不明白setTimeout是如何工作的(我对setTimeout的理解是在1ms的延迟之后,它会在一个独立的线程/进程中触发callback,而不会阻塞其他重呼叫),任何人都可以告诉我怎么做,而不会阻塞其他请求重()?

谢谢

而不是setTimeout最好使用process.nextTick或setImmediate(取决于你想要运行的callback)。 但是将长时间运行的代码放入一个函数是不够的,因为它只会在几毫秒之后阻塞你的线程。

您需要中断代码并运行setImmediate或process.nextTick多次 – 就像在每次迭代中一样,然后再安排一次新的迭代。 否则,你将无法获得任何东西。

代替这样的代码:

 var a = 0, b = 10000000; function numbers() { while (a < b) { console.log("Number " + a++); } } numbers(); 

你可以使用这样的代码:

 var a = 0, b = 10000000; function numbers() { var i = 0; while (a < b && i++ < 100) { console.log("Number " + a++); } if (a < b) setImmediate(numbers); } numbers(); 

第一个会阻塞你的线程(可能会溢出你的调用栈),第二个不会阻塞(更准确地说,它会在短时间内阻塞你的线程10000000次,让其他的东西在这些时刻之间运行)。

你也可以考虑在C / C ++中编写一个外部的进程或者编写一个本地的add,你可以使用线程。

更多信息请参阅:

  • Node.js服务器如何服务下一个请求,如果当前请求有巨大的计算?
  • nodejs中超出最大调用堆栈大小
  • 节点; Q承诺延期
  • 如何避免jimp阻塞代码node.js
  • NodeJS,承诺和性能