【问题标题】:EventListener still on after that browser has been manually closed? (Puppeteer)手动关闭浏览器后,EventListener 是否仍然开启? (木偶师)
【发布时间】:2020-07-10 11:15:50
【问题描述】:

我注意到,当您手动关闭使用 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)
            })

有什么帮助吗?

【问题讨论】:

    标签: javascript puppeteer eventemitter


    【解决方案1】:

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

    process.setMaxListeners(Infinity)
    

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

    示例:

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

    【讨论】:

    • 正确,但我需要手动启动和关闭全新的浏览器实例。另一方面,我不想关闭警告,但我想关闭侦听器,因为它们会减慢主进程
    • 如果您只需要关闭进程以获得更多资源(我想是 CPU),那么为什么 browser.close() 不是一个选项?它将完全防止内存泄漏。
    • 因为我需要手动关闭浏览器
    • 好吧,那好吧?
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 2013-08-20
    • 2018-12-20
    • 2022-12-16
    • 2020-03-07
    • 2012-03-05
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多