как отвечать на разные запросы одновременно, когда один из них занимает слишком много времени - PullRequest
0 голосов
/ 14 октября 2019

У меня есть 2 запроса: 1 / Фибоначчи (занимает ~ 10сек) и 2 / привет (немедленно)

, когда я пытаюсь запустить двухстраничное последовательное «сообщение», которое приходит после того, как Фибоначчи я использую почтальон для обоихhttp://localhost:3001/fibonacci post- http://localhost:3001/hello

Итак, мой код работает синхронно, но я хочу, чтобы он был асинхронным, я пробовал обещание и ожидание, но они оба не работали для меня.

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)
}) 

Я ожидаю, что увиденное сообщение немедленно, но оно приходит после вычисления Фибоначчи.

1 Ответ

3 голосов
/ 14 октября 2019

Node.js работает асинхронно, но не является многопоточным. Таким образом, как только ваша нод / экспресс-программа начинает работать fibonacci(), она не может запускать что-либо еще, пока эта функция не завершится.

Чтобы обеспечить отзывчивость вашей нод / экспресс-программы, вы должны найти способ делать небольшие кускивычисления Фибоначчи, используя setTimeout(), чтобы планировать их один за другим, пока вычисление не будет завершено. Использование setTimeout() позволяет node.js приостанавливать обработку ваших вычислений для обработки других вещей.

Разделение алгоритма, подобного алгоритму Фибоначчи, требует некоторой мысли и большого количества тестирования. Делать это за вас выходит за рамки ответа StackOverflow. Кроме того, если бы такой ответ был здесь, люди могли бы использовать его как магическое заклинание, а не понимать его.

Вот еще один вопрос с некоторыми полезными ответами. Как разбить долго выполняющуюся функцию в javascript, но сохранить производительность

Использование рабочего потока узла для этой функции также может помочь. Но все это влечет за собой время разработки, время тестирования и сложность вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...