在启用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只使用一个带有多个标签的浏览器,而不是运行多个浏览器?
答案 0 :(得分:1)
不能将同一用户目录同时用于多个实例。如果您传递用户目录,则不管它是哪种启动器,它都会自动选择正在运行的进程并在其上创建一个新选项卡。
当您要启动浏览器时,Puppeteer会创建一个临时配置文件。因此,如果您要利用4个实例,请在每个实例上为其传递一个不同的用户数据目录。