Tal vez este sea un posible duplicado, pero incluso después de leer muchas preguntas aquí en stackoverflow, todavía no puedo encontrar una explicación para mi problema. Mi problema/pregunta en general es cómo nodejs y special express.js manejan solicitudes http paralelas sin bloqueo. A continuación puede encontrar un breve ejemplo que representa el problema:
var express = require("express"); var app = express(); const PORT = 4003; var server = app.listen(PORT); console.log("Server running at http://127.0.0.1:" + PORT + "/"); app.get('/threadtest/request1', sendResponse1); app.get('/threadtest/request2', sendResponse2); async function sendResponse1(req, res){ await waitSomeTime2(); res.send("done waiting"); } function sendResponse2 (req, res){ res.send('Hello2'); } const waitSomeTime = () => new Promise((resolve) =>{ setTimeout(() => resolve(), 5000); }); const waitSomeTime2 = () => new Promise((resolve) =>{ calculate(() => resolve()); }); async function calculate(){ var i = 0; for(i = 0; i < 10000000000; i++){ } return i.toString(); } El servidor web funciona bien siempre que no haya tareas que necesiten tiempo de cálculo. Para fines de prueba, agregué la función de calculate (en la aplicación real, esto es una especie de análisis de la solicitud y una solicitud de base de datos).
Cuando llamé directamente al calculate() en la función sendResponse1 , el servidor no pudo manejar ninguna otra solicitud hasta que se realizó el calculate y se envió la respuesta. Mi primer intento fue usar una función asíncrona como devolución de llamada, pero eso no cambió nada. El servidor sigue bloqueado.
Después de buscar en Google, encontré el codenippet llamado waitSomeTime aquí en stackoverflow. Llamar a esto después de await en sendResponse1 funciona como se esperaba. La respuesta a una solicitud de obtención en la solicitud 1 demora aproximadamente 5 segundos, pero el servidor puede manejar otras solicitudes mientras espera. Para ser honesto, no entiendo completamente qué sucede exactamente en waitSomeTime, pero traté de integrar mi función de cálculo, pero ahora el servidor está bloqueado nuevamente.
El enfoque para hacer que la función del controlador sea asíncrona me parece correcto (lo he visto muchas veces hasta ahora), pero no puedo encontrar una manera de hacer que la función de cálculo no bloquee. No usé async/await tanto hasta ahora, así que disculpe si hice algo mal. Tal vez alguien pueda ayudarme con esto o explicar cómo se hace esto correctamente. Como se dijo, la función de cálculo es solo una carga ficticia, pero el objetivo es que el servidor no bloquee otras solicitudes si una de ellas tarda más.
Gracias por adelantado