在PM2的集群模式下运行我的Puppeteer应用程序并没有利用多个过程

时间:2019-08-26 14:22:45

标签: node.js puppeteer pm2

在启用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只使用一个带有多个标签的浏览器,而不是运行多个浏览器?

1 个答案:

答案 0 :(得分:1)

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

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