首页 > 解决方案 > 在 PM2 的集群模式下运行我的 Puppeteer 应用程序并没有利用多个进程

问题描述

在启用 PM2 的集群模式的情况下运行我的 Puppeteer 应用程序时,在并发请求期间,似乎只有一个进程被使用,而不是全部 4 个(我的每个核心 1 个)。这是我的程序的基本流程:

helpers.startChrome()
.then((resp) => {
    http.createServer(function (req, res) {
         const {webSocketUrl} = JSON.parse(resp.body);
         let browser = await puppeteer.connect({browserWSEndpoint: webSocketUrl}); 
         const page = await browser.newPage();

         ... //do puppeteer stuff

         await page.close();
         await browser.disconnect();
    })
})

这是 startChrome() 函数:

    startChrome: function(){
        return new Promise(async (resolve, reject) => {
            const opts = {
                //chromeFlags: ["--no-sandbox", "--headless", "--use-gl=egl"],
                userDataDir: "D:/pupeteercache",
                output: 'json'
            };

            // Launch chrome using chrome-launcher.
            const chrome = await chromeLauncher.launch(opts);
            opts.port = chrome.port;

            // Connect to it using puppeteer.connect().
            resp = await util.promisify(request)(`http://localhost:${opts.port}/json/version`);
            resolve(resp);
        })
    }

首先,我使用一个名为 chrome-launcher 的包来启动 chrome,然后我设置一个简单的 http 服务器来侦听对我的应用程序的传入请求。收到请求后,我连接到一开始通过 chrome-launcher 设置的 chrome 端点。

当我现在尝试在 PM2 的集群模式下运行这个应用程序时,会打开 4 个单独的 chrome 选项卡(不知道为什么它会这样工作,但没关系),一切似乎都运行良好。但是当我向服务器发送 10 个并发请求以测试并查看是否所有进程都被使用时,只有第一个被使用。我知道这一点,因为当我运行时PM2 monit,只有第一个进程正在使用任何内存。

有人可以向我解释为什么没有使用所有流程吗?是因为我如何使用 chrome-launcher 只使用一个带有多个选项卡的浏览器而不是运行多个浏览器吗?

标签: node.jspuppeteerpm2

解决方案


您不能同时对多个实例使用相同的用户目录。如果您传递一个用户目录,无论它是哪种启动器,它都会自动选择正在运行的进程并在其上创建一个新选项卡。

每当您要启动浏览器时,Puppeteer 都会创建一个临时配置文件。因此,如果您想使用 4 个实例,请在每个实例上传递一个不同的用户数据目录。


推荐阅读