[英]Do event listeners persist in memory in Node.js?
在下一篇Samer Buna的文章中...
https://medium.freecodecamp.org/node-js-child-processes-everything-you-need-to-know-e69498fe970a )
他討論了child_process.fork
在Node.js中使用child_process.fork
。 在他的示例中(位於底部附近),他有一個簡單的HTTP服務器來偵聽請求事件,並且當事件發生時,他使用child_process.fork
創建進行長時間計算的進程,然后在完成時將消息發送回父級。 為了返回子進程的結果,他注冊了一個事件偵聽器,該偵聽器偵聽來自子進程的消息,然后返回響應。 非常簡單。
父進程從子進程接收到一條消息並發送響應后, compute.on
事件偵聽器將如何處理? 它是否保留在內存中(事件循環)? 如果示例處理了100個請求,即使請求已返回,也不會有100個事件偵聽器在監聽嗎?
compute.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);
});
server.js
const http = require('http');
const { fork } = require('child_process');
const server = http.createServer();
server.on('request', (req, res) => {
if (req.url === '/compute') {
const compute = fork('compute.js');
compute.send('start');
compute.on('message', sum => {
res.end(`Sum is ${sum}`);
});
} else {
res.end('Ok')
}
});
server.listen(3000);
事件偵聽器將保留在內存中,直到它們所附加的EventEmitter被銷毀為止。
就您的代碼而言,子進程及其事件偵聽器永遠不會被丟棄。 收到請求后,每次都會創建一個全新的子進程。 請求回調完成后,將對分叉進程的引用進行垃圾收集,但是子進程本身仍在后台運行,從而造成大量僵屍進程和內存泄漏。 雖然,您的事件監聽器將繼續存在。
更好的體系結構可能是在應用程序啟動時啟動子進程池(如果負載較輕,則僅啟動一個進程),然后根據需要使用那些子進程來處理請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.