NodeJS server запускает отдельный процесс для каждого запроса в очереди

См. этот пример узла.код js:

const http = require('http');

const server = http.createServer(function (req, res) {
    if (req.url === '/loop') {
        console.log('LOOP');
        while (true) {}
    }
    res.write('Hello World');
    res.end();
});

server.listen(3000);

В моем скрипте обработка каждого запроса занимает от 3 до 5 секунд. while (true) {}это просто для примера.

Но, здесь nodejs не обрабатывает другой запрос, когда один запрос в процессе.

Я хочу выполнить несколько запросов одновременно. Но сервер одновременно выполняет только один запрос.

Примечание: мне не нравится открывать кластер или child_process для каждого запроса. Потому что nodejs принимает другой 65 msдля запуска кластера или child_process.

1 ответ

  1. При создании сервера ( и прослушивании ) nodejs создает eventloop, в котором он обрабатывает запрос, вы не сможете использовать бесконечный цикл в нем, так как он заблокирует eventloop, в котором работает ваш сервер.

    Я надеюсь, что вы имеете дело не с бесконечным циклом, а с определенным процессом, который занимает время, для которого вы используете такие модули, как async
    в функциональном блоке request/res используйте асинхронный модуль,

    async.map(['param1','param2','param3'], task, function(err, results) {
        // results of task function
    });
    

    что он делает, так это то, что он будет использовать уже запущенный eventloop и запустить процесс.

    Отметить :

    1. Большинство виртуальных машин Javascript однопоточны (включая NodeJS), поэтому вы также можете использовать setTimeoutфункцию вместо бесконечного цикла while
    2. Вы не сможете создать поток в NodeJS вместо этого использовать любое решение на основе процесса, как кластер или childprocess ( однопоточная виртуальная машина )