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

15 浏览
0 Comments

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

我对Node异步编程还很新,我想知道如何编写一些Express请求处理程序,可以处理耗时的重计算任务,而不阻塞后续的请求处理。\n我想使用setTimeout将任务放入事件循环中,但它仍然会阻塞其他请求:\n

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

\n我猜我对setTimeout的工作原理理解不正确(我理解的是,在1毫秒延迟之后,它会在一个独立的线程/进程中触发回调,而不会阻塞对heavy的其他调用),有人可以告诉我如何在不阻塞对heavy的其他请求的情况下实现这一点吗?\n谢谢。

0
0 Comments

Express是一个流行的Node.js框架,用于构建Web应用程序。在处理Express请求时,有时候我们需要执行长时间运行的代码,但这可能会阻塞主线程,导致请求处理变慢或其他请求被阻塞。

解决这个问题的方法是编写非阻塞的异步函数,使得在执行长时间运行的代码时,主线程可以继续处理其他请求。下面是一个示例,演示了如何通过将代码拆分为多个部分,并在每个部分之间使用setImmediate或process.nextTick来调度新的迭代,来实现非阻塞的异步函数:

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();

在上面的示例中,我们将代码拆分为多个部分,并在每个部分之间使用setImmediate回调来调度新的迭代。这样,主线程在每个迭代之间有机会处理其他请求,从而实现非阻塞的异步函数。

另外,除了以上的方法,还可以考虑使用外部进程或编写C/C++的本地扩展,从而利用多线程来解决长时间运行的代码阻塞主线程的问题。

如果想要了解更多信息,可以参考以下链接:

- [How node.js server serve next request, if current request have huge computation?](https://stackoverflow.com/questions/42996232/42997352#42997352)

- [Maximum call stack size exceeded in nodejs](https://stackoverflow.com/questions/42219167/42224401#42224401)

- [Node; Q Promise delay](https://stackoverflow.com/questions/41287845/41287978#41287978)

- [How to avoid jimp blocking the code node.js](https://stackoverflow.com/questions/43007352/43007800#43007800)

- [NodeJS, Promises and performance](https://stackoverflow.com/questions/37985066/37986778#37986778)

希望以上解答对你有帮助!

0