当父节点在 Node 中分叉一个 long-运行 子进程时,请求处理程序变慢
Request handler slows when parent forks a long-running child process in Node
我正在通过使用节点子进程模块分叉进程来卸载 Express 请求-响应周期中的一些处理。我基本上在 Express 中间件中有以下代码:
forkedProcess = child.fork(scriptFile);
forkedProcess.send(messageToChild);
forkedProcess.on('message',function(messageFromChild) {...});
然后在子进程中,我有:
process.on('message', function(messageFromParent) {....});
process.send('messageToParent);
process.exit(0);
在测试时,我决定插入一些虚拟语句来使子进程 运行 保持很长时间,以便我可以在此期间向父进程发送另一个请求。问题是第二个请求需要很长时间才能响应。请求处理程序本身在第二次请求时不会启动几秒钟。
我无法理解为什么?子进程不应阻塞父主事件循环,显然不会,因为第二个请求确实在第一个请求的子进程退出之前得到处理,但需要很长时间。如果我从子进程中获取虚拟语句,请求-响应周期将正常工作。我模拟了测试用例,因为子进程是根据一些开发人员脚本动态生成的。这些开发人员脚本不应该减慢主循环......显然它确实如此。为什么?
考虑到 time/memory 分叉进程本身的成本,对每个请求分叉并不是一个好主意。理想情况下,您应该在启动时分叉所需的进程,并在需要时分叉 send/receive 消息。
希望这对您有所帮助
我正在通过使用节点子进程模块分叉进程来卸载 Express 请求-响应周期中的一些处理。我基本上在 Express 中间件中有以下代码:
forkedProcess = child.fork(scriptFile);
forkedProcess.send(messageToChild);
forkedProcess.on('message',function(messageFromChild) {...});
然后在子进程中,我有:
process.on('message', function(messageFromParent) {....});
process.send('messageToParent);
process.exit(0);
在测试时,我决定插入一些虚拟语句来使子进程 运行 保持很长时间,以便我可以在此期间向父进程发送另一个请求。问题是第二个请求需要很长时间才能响应。请求处理程序本身在第二次请求时不会启动几秒钟。
我无法理解为什么?子进程不应阻塞父主事件循环,显然不会,因为第二个请求确实在第一个请求的子进程退出之前得到处理,但需要很长时间。如果我从子进程中获取虚拟语句,请求-响应周期将正常工作。我模拟了测试用例,因为子进程是根据一些开发人员脚本动态生成的。这些开发人员脚本不应该减慢主循环......显然它确实如此。为什么?
考虑到 time/memory 分叉进程本身的成本,对每个请求分叉并不是一个好主意。理想情况下,您应该在启动时分叉所需的进程,并在需要时分叉 send/receive 消息。 希望这对您有所帮助