javascript - 手动关闭浏览器后,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)
})
有什么帮助吗?
解决方案
您可以通过在 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 })
推荐阅读
- c - C中结构内的结构
- gremlin - 使用类型间接连接顶点
- angular - Angular:具有管理后端的应用程序的正确项目结构
- sprite-kit - Spritekit 物理销毁对象动画
- apache-spark - Azure HDInsight 的 SparkRunner 上的 Apache Beam 管道
- javascript - 为什么这个最低公分母函数对于更高的数值输入返回未定义
- perl - 在 FASTQ 中合并具有不同标题顺序的 Fasta 和 Qual 文件
- elm - 如何使用 elm-bootstrap 4.1.0 制作条纹表?
- javascript - CKEDITOR - 插入 html 文本或 img 单击 CKEDITOR 外部的某些 DIV
- javascript - Firebase With Web:在参考中使用用户 ID 会导致错误:未捕获的 TypeError:无法读取未定义的属性“on”