首页 > 解决方案 > 手动关闭浏览器后,EventListener 是否仍处于开启状态?(木偶师)

问题描述

我注意到当您手动关闭使用 Puppeteer 启动的浏览器时,它会持续占用内存。我尝试了 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)
            })

有什么帮助吗?

标签: javascriptpuppeteereventemitter

解决方案


您可以通过在 puppeteer 主脚本之前添加Infinity值(或您喜欢的任何数字)来设置最大的侦听器:process.setMaxListeners()

process.setMaxListeners(Infinity)

一般来说,如果您的用例允许,您可以通过重用同一个浏览器实例来避免启动这么多 chromium 实例。browser.wsEndpoint您可以使用then 而不是 new puppeteer.launch-s创建一个 websocket 端点,您可以puppeteer.connect使用该browserWSEndpoint选项到现有的 wsEndpoint。

例子:

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

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

推荐阅读