我有一个node应用程序,它有两个GET
请求,例如-测试和延迟,
var express = require("express");
var app = new express();
app.use('/', express.Router());
app.get('/delay', function (req, res) {
for (var i = 0; i < 500000; i = i + 0.0001) {
let r = 'r';
}
res.json({ 'message' : 'delay message'});
})
app.get('/test', function (req, res) {
res.json({ 'message': 'hello world' });
})
app.listen(1337);
delay
方法执行并产生延迟的输出,大约在6-7秒之后,而test
方法立即产生输出。
但是在Postman中测试时,如果我运行delay
方法,并且在它完成之前运行test
,那么直到delay
完成后,test
的输出才会出现。只有在delay
完成后,我才能得到test
的输出。
如何让这两个请求并行运行,彼此独立?
附言:我也尝试过路由器(express.Router()),但它仍然是一样的。
谢谢!
发布于 2018-02-28 19:25:45
delay
端点正在阻塞,这是一个占用服务器运行的单个线程的代价高昂的循环。您需要将对线程的控制交给全局事件循环,以便它可以自由地接受新请求,并将事件安排在稍后发生。通常使用setTimeout
,或使用其他接受回调的异步应用程序接口:
app.get('/delay', function (req, res) {
setTimeout(function () { res.json({ 'message' : 'delay message'}); }, 6000);
})
如果你确实有一个昂贵的任务必须运行完成,你需要研究线程,或者把它移到一个完全不同的进程中,你可以通过套接字或其他东西与之通信。
发布于 2018-02-28 19:26:19
你不能。Node.js在单个线程上运行事件循环。如果你有阻塞代码,那么它就会阻塞。
避免执行CPU密集型操作(比如一遍又一遍地循环,而不做任何重要的事情)。
您可以采用一些方法来缓解此类问题(例如,使用setTimeout
在批处理中处理数据,以便让事件队列中的其他事件在批之间运行),但处理任何给定问题的最佳方法取决于实际问题。
发布于 2018-02-28 19:27:51
这就是Node.js的工作原理。它是一个单线程的事件循环,不像其他服务器实现是基于每个请求的线程操作的,这可能就是您想要的。
通常,您不希望通过在请求中执行一个长时间的cpu密集型操作来锁定主线程。相反,你可能会把它交给一个工人或类似的人,比如setTimeout
。
当然,您可以拥有更多的Node.js实例,并以某种方式对它们进行集群,这样您的两个调用可以负载平衡到单独的后端Node.js服务器,但在您的示例中,您似乎更有可能只需要在长时间运行的方法中采用一种更异步的方法,以释放主线程来服务其他调用。
https://stackoverflow.com/questions/49028332
复制相似问题