运行 我在 PM2 集群模式下的 Puppeteer 应用没有利用多进程
Running my Puppeteer app within PM2's cluster mode doesn't take advantage of the multiple processes
虽然 运行我的 Puppeteer 应用程序启用了 PM2 的集群模式,但在并发请求期间,似乎只使用了一个进程,而不是全部 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 端点,我在开始时通过 chrome-launcher 设置。
当我现在尝试在 PM2 的集群模式下 运行 这个应用程序时,打开了 4 个单独的 chrome 选项卡(不知道为什么会这样,但没关系),一切似乎都是运行宁好。但是当我向服务器发送 10 个并发请求以测试并查看是否所有进程都被使用时,只有第一个被使用。我知道这一点是因为当我 运行 PM2 monit
时,只有第一个进程正在使用任何内存。
有人可以向我解释为什么没有使用所有进程吗?是因为我使用 chrome-launcher 只使用一个浏览器和多个选项卡而不是 运行 多个浏览器吗?
不能同时为多个实例使用同一个用户目录。如果您传递一个用户目录,无论它是哪种启动器,它都会自动选择 运行 进程并在该进程上创建一个新选项卡。
只要您想启动浏览器,Puppeteer 就会创建一个临时配置文件。因此,如果您想使用 4 个实例,请在每个实例上传递不同的用户数据目录。
虽然 运行我的 Puppeteer 应用程序启用了 PM2 的集群模式,但在并发请求期间,似乎只使用了一个进程,而不是全部 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 端点,我在开始时通过 chrome-launcher 设置。
当我现在尝试在 PM2 的集群模式下 运行 这个应用程序时,打开了 4 个单独的 chrome 选项卡(不知道为什么会这样,但没关系),一切似乎都是运行宁好。但是当我向服务器发送 10 个并发请求以测试并查看是否所有进程都被使用时,只有第一个被使用。我知道这一点是因为当我 运行 PM2 monit
时,只有第一个进程正在使用任何内存。
有人可以向我解释为什么没有使用所有进程吗?是因为我使用 chrome-launcher 只使用一个浏览器和多个选项卡而不是 运行 多个浏览器吗?
不能同时为多个实例使用同一个用户目录。如果您传递一个用户目录,无论它是哪种启动器,它都会自动选择 运行 进程并在该进程上创建一个新选项卡。
只要您想启动浏览器,Puppeteer 就会创建一个临时配置文件。因此,如果您想使用 4 个实例,请在每个实例上传递不同的用户数据目录。