繁体   English   中英

分离子进程对主进程 NodeJS 的影响

[英]Impact of detached child process to master process NodeJS

我在 NodeJS API 服务器中使用child_process.fork 我是这样称呼它的:

const { fork } = require('child_process');

const dequeuingChild = fork('dequeue-child.js', null, {stdio: 'inherit', detached: false});

...

// inside some function
dequeuingChild.send({ action: ACTION.DEQUEUE }); // btw is this .send() and counterpart .on('message') sync?
...

我从文档中阅读了有关分离选项的信息,其中说:

在非 Windows 平台上...子进程将成为新进程组的领导者和 session...

我关心的是这个进程组中包含什么,session 等。我的意思是,这是否意味着非分离的子进程仍然共享主进程的资源? 在非分离子进程中运行的长时间运行代码仍然会影响主进程的性能吗?

我在某处读到,在内部,NodeJS 的 C++ 部分创建了将异步操作委托给的线程,并且该部分是阻塞的。 非分离的子进程是否共享这些线程(w/c 意味着它们也会阻止来自主进程的事件)? memory 使用/共享与分离/附加子进程是否有区别?

我问这个是因为我的主进程中有 web 服务器,它应该尽可能快地接收和排队(等待异步)请求,然后我委托出队部分,它执行更多处理并且运行速度可能比入队部分慢到预先分叉的子进程(通过.send() 所以我希望我的 web 服务器(接收)部分尽可能快地运行,而不是让子进程陷入困境或影响它。 当我退出主人时,孩子不必留下来,实际上我在主人退出时退出它。

因为我不了解影响,我被撕裂了,我应该使用detached选项吗?

非常感谢!

非分离的子进程是否共享这些线程(w/c 意味着它们也会阻止来自主进程的事件)?

不,child_process(无论是否分离)不与原始进程共享任何线程或 memory。 WorkerThread确实与父进程共享一些基础设施,但不与子进程共享。 child 是它自己的 OS 进程,有自己独立的 V8 引擎和独立的 libuv 和事件循环。

memory 使用/共享与分离/附加子进程是否有区别?

不。

我问这个是因为我的主进程中有 web 服务器,它应该尽可能快地接收和排队(等待异步)请求,然后我委托出队部分,它执行更多处理并且运行速度可能比入队部分慢到预先分叉的子进程(via.send())。 所以我希望我的 web 服务器(接收)部分尽可能快地运行,而不是让子进程陷入困境或影响它。

无论孩子是否分离,这不会有任何不同。

当我退出主人时,孩子不必留下来,实际上我在主人退出时退出它。

然后,不要使用detached

因为我不了解影响,我被撕裂了,我应该使用分离选项吗?

我认为您没有任何理由使用detached 如果你不希望孩子在父母退出后继续独立运行,那真的没有理由使用它。

在非分离子进程中运行的长时间运行代码仍然会影响主进程的性能吗?

任何子进程中的代码,无论是否分离,都会影响父进程的性能,因为它们都在竞争来自操作系统的 CPU 周期。 但是,无论是否分离,这并没有什么不同。

仅供参考,您可能与子进程共享的最常见的东西是 stdio 或 stdout (尽管您可以选择在创建子进程时是否共享它们),但是是否共享这些不应该影响性能之一方式或您描述的其他方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM