Как NodeJs «Дочерний процесс» взаимодействует с событием l oop? - PullRequest
1 голос
/ 03 марта 2020

Меня беспокоит окружение, если оно заблокирует событие l oop. Так что, если я вызову внутренний скрипт, он заблокирует событие l oop на весь срок действия скрипта или он активируется в своем собственном потоке?

  const { spawn } = require('child_process');
  const pythonscript = spawn('py script.py');//assume this just runs forever

Я ясно прочитал из документации, что создание этого процесса порождает новый процесс, но разделяет ли этот новый процесс тот же поток, что и приложение Nodejs, или он получает собственный поток? Например, смогу ли я буквально увидеть процесс «script.py», если бы проверил свои запущенные процессы?

Если это вопрос, специфичный для ОС c, пожалуйста, дайте ответ с таким предположением.

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы не заблокируете событие l oop, если не используете функции *Sync (например, execFileSync).

Подробнее см. документы child_process .

1 голос
/ 03 марта 2020

Меня беспокоит окружение, если оно заблокирует событие l oop.

Нет. Запуск нового дочернего процесса с любым из методов child_process, которые НЕ заканчиваются на Sync, не блокирует ваше событие l oop. Моментально время выполнения команды ОС запускает новый процесс, а затем он возвращается, и вы возвращаетесь к своему собственному событию l oop, независимо от того, что делает дочерний процесс.

Таким образом, если бы я вызвал внутренний скрипт, он заблокировал бы событие l oop на весь срок жизни скрипта или он активировал бы в своем собственном потоке?

«Дочерний процесс» - это новый "обработать". Это не нить в вашем процессе. Это совершенно новый процесс.

Я ясно прочитал из документации, что этот процесс порождает новый процесс, но разделяет ли этот новый процесс тот же поток, что и приложение Nodejs, или он получает собственный поток?

Каждый процесс имеет свой собственный основной поток. Итак, новый дочерний процесс, который вы запускаете, имеет собственный отдельный поток в своем собственном процессе, полностью независимый от родительского.

Я бы буквально увидел процесс "script.py", если бы проверил свои запущенные процессы ?

Да, вы бы. Это будет python процесс, выполняющийся script.py.

Если это вопрос, специфичный для ОС c, пожалуйста, дайте ответ с таким предположением.

Ответ одинаков для всех операционных систем.


Теперь, если вы использовали один из Sync методов, таких как child_process.spawnSync(), он все равно запускает дочерний процесс в своем собственном процессе (который имеет это собственный основной поток), но, выбрав Sync версию метода, вы явно попросили ваш node.js процесс заблокировать событие l oop до завершения дочернего процесса (по существу, чтобы дождаться его, прежде чем он сделает что-нибудь еще). Это поведение только для spawnSync(), execFileSync() и execSync().

...