手动关闭浏览器后,EventListener仍然打开吗? (木偶)

时间:2020-07-10 11:15:50

标签: javascript puppeteer eventemitter

我注意到,当您手动关闭使用Puppeteer启动的浏览器时,它会持续占用内存。我尝试了11次启动浏览器实例,然后手动将其关闭(单击浏览器界面右上角的叉号),但是在第11次尝试中,我得到了警告

(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 exit listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 exit listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGTERM listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGTERM listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGHUP listeners added to [process]. Use emitter.setMaxListeners() to increase limit
(node:20424) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGHUP listeners added to [process]. Use emitter.setMaxListeners() to increase limit

我试图通过在发生“断开连接”事件时杀死浏览器的子进程(由其pid标识)来解决此问题,但它不起作用:

            browser = await puppeteer.launch({
                headless:false,
                devtools:false,       
            })
            page = (await browser.pages())[0];
            const browserPid = browser.process().pid;

            browser.on('disconnected', () => {
                process.kill(browserPid)
            })

有帮助吗?

1 个答案:

答案 0 :(得分:0)

您可以通过在伪造者的主脚本之前将Infinity值(或您喜欢的任何数字)添加到process.setMaxListeners()中来设置最多的监听者:

process.setMaxListeners(Infinity)

通常,通过重用相同的浏览器实例,可以避免启动这么多的Chrome实例(如果用例允许的话)。您可以使用browser.wsEndpoint创建一个websocket端点,然后可以使用puppeteer.launch选项puppeteer.connect到现有的wsEndpoint而不是新的browserWSEndpoint-。

示例:

  const browser = await puppeteer.launch({ headless: true })
  const browserWSEndpoint = await browser.wsEndpoint()
  [...]

  const browser2 = await puppeteer.connect({ browserWSEndpoint })