我有 2 个请求 1/斐波那契(大约需要 10 秒)和 2/你好(立即)
当我尝试运行 2 页连续“消息”时,斐波那契数之后会出现 我两者都使用 postman 获取-http://localhost:3001/fibonacci 后http://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/