如何在Express请求处理程序中编写非阻塞的异步函数
如何在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谢谢。
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)
希望以上解答对你有帮助!