node.js - 当其中一个请求花费太多时间时,如何同时响应不同的请求

标签 node.js express asynchronous postman

我有 2 个请求 1/斐波那契(大约需要 10 秒)和 2/你好(立即)

当我尝试运行 2 页连续“消息”时,斐波那契数之后会出现 我两者都使用 postman 获取-http://localhost:3001/fibonaccihttp://localhost:3001/hello

所以我的代码运行同步,但我希望它异步,我尝试了promise和await,但它们都不适合我。

const express = require('express')
const app = express()
const bigInt = require("big-integer");

const port = process.env.PORT || 3001

app.get('/fibonacci',async (req,res) => {
   res.send(fibonacci(bigInt(700000)))
})

app.post('/hello',async (req, res) => {
   res.send("message")
})


const fibonacci = (num) => {
   var a = bigInt(1), b = bigInt(0), temp = bigInt
   while (num > 0){ 
      temp = a 
      a = (a.add(b))
      b = temp 
      num= (num.add(-1)) 
   }
  return b;
}

app.listen(port, () => {
    console.log('Server is up on port ' + port)
}) 

我希望立即看到消息,但它是在斐波那契计算之后出现的。

最佳答案

Node.js 异步运行,但它不是多线程的。因此,一旦您的 Node/express 程序开始运行 fibonacci(),它就无法运行其他任何内容,直到该函数完成为止。

为了保持 Node/express 程序的响应能力,您必须找到一种方法来使用 setTimeout() 执行小块斐波那契计算,以将它们一个接一个地调度,直到计算完成。使用 setTimeout() 让 Node.js 暂停计算以处理其他事情。

对像斐波那契这样的算法进行分块需要一些思考和大量的测试。为您执行此操作超出了 StackOverflow 答案的范围。另外,如果有这样的答案,人们可​​能会将其用作魔咒,而不是理解它。

这是另一个问题,其中有一些有用的答案。 How to break up a long running function in javascript, but keep performance

为此功能使用 Node 工作线程也可能有所帮助。但所有这些都会给您的程序带来开发时间、测试时间和复杂性债务。

关于node.js - 当其中一个请求花费太多时间时,如何同时响应不同的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58377205/

相关文章:

java - findViewByID 在 FirestoreRecyclerAdapter 中返回 null

node.js - AWS EC2 端口 80 连接被拒绝

javascript - Typescript - 找不到名称 'fetch'(通用库)

node.js - 查询 Node process.send 的功能和影响

javascript - Node : No action performed by clicking on register button

javascript - 如何从异步调用返回响应?

在单页应用程序中有多个文件的情况下,Javascript 异步延迟执行顺序

node.js - 需要将wrappbootstrap主题集成到nodejs Expressjs应用程序中的程序

image - 如何使用低分辨率的裁剪照片作为指导,重新裁剪原始照片的高分辨率副本?

node.js - 如何将 shareJS 的文档与文件系统同步