node.js - 在 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 只使用一个带有多个选项卡的浏览器而不是运行多个浏览器吗?
解决方案
您不能同时对多个实例使用相同的用户目录。如果您传递一个用户目录,无论它是哪种启动器,它都会自动选择正在运行的进程并在其上创建一个新选项卡。
每当您要启动浏览器时,Puppeteer 都会创建一个临时配置文件。因此,如果您想使用 4 个实例,请在每个实例上传递一个不同的用户数据目录。
推荐阅读
- python - 如何调整熊猫直方图上的刻度标签?
- flask - 在命令提示符下导入火炬时出现问题,但它直接在 VS 代码/Jupyter 中工作
- php - 如何通过键/值在 PHP 中分解这个 json_decoding 文件?
- windows - 如何验证文件夹中是否缺少文件(批处理脚本)?
- c - 带有双链表的随机快速排序
- oracle - 获取项目(错误报告 - 未知命令
- css - Flexbox:如何不让超大的子元素(沿横轴)过度拉伸嵌套的 flexbox
- azure - 如何从 Azure 数据块写入 RabbitMQ?
- python - 如何获取邮件回复exchangelib的message-id
- spring - 是否可以根据目标 URL 禁用 Spring Cloud Sleuth 标头传播?