首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node Js不异步

Node Js不异步
EN

Stack Overflow用户
提问于 2018-02-28 19:18:50
回答 4查看 218关注 0票数 0

我有一个node应用程序,它有两个GET请求,例如-测试和延迟,

代码语言:javascript
运行
复制
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()),但它仍然是一样的。

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2018-02-28 19:25:45

delay端点正在阻塞,这是一个占用服务器运行的单个线程的代价高昂的循环。您需要将对线程的控制交给全局事件循环,以便它可以自由地接受新请求,并将事件安排在稍后发生。通常使用setTimeout,或使用其他接受回调的异步应用程序接口:

代码语言:javascript
运行
复制
app.get('/delay', function (req, res) {
    setTimeout(function () { res.json({ 'message' : 'delay message'}); }, 6000);
})

如果你确实有一个昂贵的任务必须运行完成,你需要研究线程,或者把它移到一个完全不同的进程中,你可以通过套接字或其他东西与之通信。

票数 3
EN

Stack Overflow用户

发布于 2018-02-28 19:26:19

你不能。Node.js在单个线程上运行事件循环。如果你有阻塞代码,那么它就会阻塞。

避免执行CPU密集型操作(比如一遍又一遍地循环,而不做任何重要的事情)。

您可以采用一些方法来缓解此类问题(例如,使用setTimeout在批处理中处理数据,以便让事件队列中的其他事件在批之间运行),但处理任何给定问题的最佳方法取决于实际问题。

票数 0
EN

Stack Overflow用户

发布于 2018-02-28 19:27:51

这就是Node.js的工作原理。它是一个单线程的事件循环,不像其他服务器实现是基于每个请求的线程操作的,这可能就是您想要的。

通常,您不希望通过在请求中执行一个长时间的cpu密集型操作来锁定主线程。相反,你可能会把它交给一个工人或类似的人,比如setTimeout

当然,您可以拥有更多的Node.js实例,并以某种方式对它们进行集群,这样您的两个调用可以负载平衡到单独的后端Node.js服务器,但在您的示例中,您似乎更有可能只需要在长时间运行的方法中采用一种更异步的方法,以释放主线程来服务其他调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49028332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档