【问题标题】:Puppeteer Chromium instance managementPuppeteer Chromium 实例管理
【发布时间】:2021-01-24 21:59:54
【问题描述】:

所以我看到了 puppeteer-cluster 包,但它有非常手动的示例,我的情况非常动态,所以我会尽力解释。

好的,所以我有一个应用程序,用户可以在其中安排帖子。一旦发布时间到了,puppeteer 就会运行,进入网站,使用我应用程序数据库中的凭据登录用户,然后发布相当简单的内容。

当说 20 位用户都决定在今天下午 1 点发帖时,问题就出现了。现在 puppeteer 生成了 25 个 chromium 实例,这些实例与服务器导致 RAM 受限的原因相混淆。我要问的基本上是如何实现以下目标: 1)。将 puppeteer 的并发限制为 10 个实例。再多的话,它基本上应该分批做,比如先做 10,然后关闭它们,然后再开始 10,等等。 2)。如果少于 10 个,则保持正常功能。

我知道这似乎是我在给你做作业,但相信我,我只需要一些指导、一点帮助或指出我正确的方向就足够了。或者如果你能告诉我如何使用它:puppeteer-cluster 动态地满足我的需要。非常感谢!

【问题讨论】:

    标签: node.js puppeteer job-scheduling


    【解决方案1】:
    1. 首先,您需要有一个预先消息队列系统 捕获所有传入的并发请求,如 Kafka / RabbitMQ
    2. 以 10 个请求为一组获取消息并运行 for 循环 这些块和每个循环为每个块创建一个集群。
    3. 以下代码说明了如何完成它,这段代码回答了您列出的所有问题。

    代码 sn-p:

    const { Cluster } = require('puppeteer-cluster');
    const runChunks = async (chunkArr, chunkSize) => {
        //Launching cluster for each chunk
        const cluster = await Cluster.launch({
            concurrency: Cluster.CONCURRENCY_CONTEXT,
            maxConcurrency: chunkSize, //Defined max chunksize
        });
        //Task to complete
        await cluster.task(async ({ page, data: url }) => {
            await page.goto(url);
            console.log('Reached: ', url);
            // Here goes the code for scraping task to complete ...
        });
        //Chunked array URLs queued for task completion
        chunkArr.forEach(data => {
            cluster.queue(data.url);
        });
        //Closing the cluster instance after it becomes idle
        await cluster.idle();
        await cluster.close();
    };
    
    function chunkArrGenerator(arr, chunkSize) {
        let chunksArr = [];
        let indexCounter = 0;
        while (indexCounter <= (arr.length - 1)) {
            chunksArr.push(arr.splice(0, chunkSize));
            indexCounter++;
        }
        return chunksArr;
    }
    
    // assume request array having 100 objects with url data
    let arr = [{ url: "https://www.amazon.in/" }, { url: "https://www.flipkart.com/" }, { url: "https://www.crateandbarrel.com/" }, { url: "https://www.cb2.com/" } /* so on ... */];
    
    let size = 2;  //chunk size
    //Following line creates chunks of size 2, you change it to 10 as per your need
    let chunks = chunkArrGenerator(arr, size);
    //Executing each cluster on each chunk
    chunks.forEach(async (chunk) => {
        await runChunks(chunk, size);
    });
    

    【讨论】:

    • 谢谢,这看起来很有用,让我试一试,如果可行,请接受。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多