我注意到,当您手动关闭使用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)
})
有帮助吗?
答案 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 })