在Samer Buna的以下文章中......
https://medium.freecodecamp.org/node-js-child-processes-everything-you-need-to-know-e69498fe970a)
他谈到在Node.js中使用t = Tree.load_tree()
>>>t
<tree storing nodes [10, 82, 17, 25, 78, 93, 64, 53, 74]>
>>>Solution.bfs(t, 10), Solution.bfs(t, 200)
(True, False)
>>>list(Solution.pretty_nested(t))
[[42], [[10], [[17], [[25], []]], [82], [[78], [[64], [[53], [], [74], []]], [93], []]]]
。在他的示例中(靠近底部),他有一个简单的HTTP服务器,用于侦听请求事件,当事件发生时,他使用child_process.fork
创建进行长计算的进程,然后将消息发送回父进程完成后。为了返回子进程的结果,他注册了一个侦听来自子进程的消息的事件监听器,然后返回响应。很直接。
一旦父进程收到来自子进程的消息并发送响应,child_process.fork
事件侦听器会发生什么?它是否在内存中持续存在(事件循环)?如果该示例处理了100个请求,那么即使请求已被返回,也不会有100个事件侦听器正在侦听吗?
compute.js
compute.on
server.js
const longComputation = () => {
let sum = 0;
for (let i = 0; i < 1e9; i++) {
sum += i;
};
return sum;
};
process.on('message', (msg) => {
const sum = longComputation();
process.send(sum);
});
答案 0 :(得分:0)
事件侦听器会在内存中保留,直到它们附加到的EventEmitter被销毁。
对于代码,子进程及其事件侦听器永远不会被丢弃。收到请求后,每次都会创建一个全新的子进程。请求回调完成后,对分叉进程的引用被垃圾收集,但子进程本身仍在后台运行,从而产生大量僵尸进程和内存泄漏。虽然,您的事件监听器仍将存在。
更好的体系结构可能是在应用程序启动时启动子进程池(或者,如果负载很轻,只需一个进程),然后根据需要使用这些子进程来处理请求。