puppeteer-cluster:排队而不是执行

时间:2019-08-05 14:51:39

标签: javascript node.js puppeteer puppeteer-cluster

我正在尝试使用Puppeteer Cluster,但我只是不了解如何正确使用排队。它可以仅用于不等待响应的呼叫吗?我正在用炮兵同时触发一堆请求,但是它们全部失败,而当我直接执行命令时,只有一部分失败。

我直接从examples那里获取了代码,并用execute替换了queue,我希望它能工作,除了代码不等待结果。反正有办法实现吗?

这可行:

const screen = await cluster.execute(req.query.url);

但这会中断:

const screen = await cluster.queue(req.query.url);

这是queue的完整示例:

const express = require('express');
const app = express();
const { Cluster } = require('puppeteer-cluster');

(async () => {
    const cluster = await Cluster.launch({
        concurrency: Cluster.CONCURRENCY_CONTEXT,
        maxConcurrency: 2,
    });
    await cluster.task(async ({ page, data: url }) => {
        // make a screenshot
        await page.goto('http://' + url);
        const screen = await page.screenshot();
        return screen;
    });

    // setup server
    app.get('/', async function (req, res) {
        if (!req.query.url) {
            return res.end('Please specify url like this: ?url=example.com');
        }
        try {
            const screen = await cluster.queue(req.query.url);

            // respond with image
            res.writeHead(200, {
                'Content-Type': 'image/jpg',
                'Content-Length': screen.length //variable is undefined here
            });
            res.end(screen);
        } catch (err) {
            // catch error
            res.end('Error: ' + err.message);
        }
    });

    app.listen(3000, function () {
        console.log('Screenshot server listening on port 3000.');
    });
})();

我在这里做错了什么?我真的很想使用排队,因为没有它,每个传入的请求似乎都会减慢所有其他请求的速度。

1 个答案:

答案 0 :(得分:3)

此处puppeteer-cluster的作者。

从文档中引用:

  

cluster.queue(..) :[...]请注意,此函数仅出于向后兼容的原因而返回Promise。此函数不会异步运行,将立即返回。

     

cluster.execute(...) :[...]的工作方式类似于Cluster.queue,只是此函数返回一个Promise,该Promise将在执行任务后解决。如果在执行过程中发生错误,此函数将拒绝抛出错误的Promise。将不会触发“ taskerror”事件。

何时使用哪种功能:

  • 如果要排队大量作业(例如URL列表),请使用cluster.queue。任务功能需要通过将结果打印到控制台或将结果存储到数据库中来保存结果。
  • 如果您的任务函数返回结果,请使用cluster.execute。这仍将排队等待作业,因此除了等待作业完成之外,这就像调用queue。在这种情况下,通常会出现一个“空闲集群”,当请求到达服务器时(例如您的示例代码中)就会使用它。

因此,您肯定要使用cluster.execute来等待任务功能的结果。您没有看到任何错误的原因是(如上所述)cluster.queue函数的错误是通过taskerror事件发出的。直接抛出cluster.execute错误(承诺被拒绝)。在两种情况下,您的工作都很有可能失败,但是仅在cluster.execute

中可见