Ответ 1
Как сервер node.js обслуживает следующий запрос, если текущий запрос имеет огромные вычисления?
Это не - если это вычисление происходит в основном потоке и не делится на более мелкие части.
Чтобы иметь возможность обслуживать другой запрос во время задачи с интенсивным процессором, вам необходимо либо:
- разбивайте свои вычисления на части и используйте setImmediate или process.nextTick для их запуска.
- использовать внешний процесс для этой задачи и вызывать его как любую другую внешнюю программу или услугу с использованием нереста HTTP, TCP, IPC или дочернего процесса или с помощью системы очередей, pub/sub и т.д.
- написать собственное дополнение в С++ и использовать потоки для этого
Важно то, что вам нужен стек для частого разворачивания в вашем потоке V8, чтобы цикл событий имел возможность обрабатывать события как можно чаще. И имейте в виду, что, когда у вас длинное вычисление, которое занимает 10 секунд, и вы делите его на 1000 небольших частей, ваш сервер будет по-прежнему блокироваться от обслуживания новых запросов или любого другого ввода-вывода или события 1000 раз в течение 10 мс каждый раз.
Если у вас много операций с процессором, я бы настоятельно рекомендовал вывести их из вашего процесса, который обслуживает запросы, а не только из-за блокировки цикла событий, а также потому, что в таком случае вы хотите использовать все ваши ядра одновременно, поэтому было бы оптимально иметь столько процессов (или потоков), выполняющих тяжелую работу CPU, как ядра в вашем процессоре (или, возможно, больше с гиперпотоком), и иметь все ваши операции ввода/вывода - связанных операций в отдельном процессе, который сам по себе не обрабатывает тяжелые операции ЦП.