簡體   English   中英

事件偵聽器是否保留在Node.js的內存中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM