Поскольку node.js запускает ваш Javascript как однопоточный (только одна часть Javascript когда-либо запускается одновременно) и не использует временной интервал, пока ваш worker.process()
выполняет свой синхронный код, никакие другие запросы не могут быть обработанываш сервер.Вот почему worker.process()
должен завершиться до того, как будет обработан любой из http-запросов, поступивших во время его работы.Цикл событий node.js занят до тех пор, пока worker.process()
не будет выполнен, поэтому он не может обслуживать любые другие события (например, входящие запросы HTTP).
Вот некоторые из способов обойти это:
Сгруппируйте свое приложение со встроенным модулем кластера, чтобы у вас была куча процессов, которые могут либо работать с кодом worker.process()
, либо обрабатывать входящие запросы http.
Когда пришло время вызвать worker.process()
, запустите новый процесс node.js, запустите обработку там и передайте результат с помощью стандартного межпроцессного взаимодействия.Затем ваш основной процесс node.js продолжает читать, чтобы обрабатывать входящие http-запросы практически мгновенно по мере их поступления.
Создать рабочую очередь из группы дополнительных процессов node.js, которые выполняют задания, которыепомещаются в очередь и настраивают эти процессы, чтобы иметь возможность запускать ваш код worker.process()
из очереди.Это вариант # 2, который ограничивает число процессов и сериализует работу в очередь (лучше управляемую, чем # 2).
Пересмотр способа, которым worker.process()
выполняет свою работу такчто он может выполнять несколько мс работы за раз, а затем вернуться обратно к циклу сообщений, чтобы другие события могли выполняться (например, входящие запросы http), а затем возобновить свою работу еще на несколько мс за раз.Обычно это требует создания какого-либо объекта с состоянием, который может выполнять небольшую работу за раз, когда он вызывается, но часто бывает сложно эффективно программировать.
Обратите внимание, что #1, № 2 и № 3 требуют, чтобы работа выполнялась в других процессах.Это означает, что process.status()
нужно будет получить статус от этих других процессов.Итак, вам либо понадобится какой-то межпроцессный способ связи с другими процессами, либо вам нужно будет сохранять состояние по мере того, как вы переходите в какое-то хранилище, доступное для всех процессов (например, redis), чтобы его можно было просто извлечь из него..