猿问

puppeteer-cluster:排队而不是执行

我正在试验 Puppeteer Cluster,但我不明白如何正确使用排队。它只能用于不等待响应的呼叫吗?我正在使用 Artillery 同时发出一堆请求,但是当我直接执行命令时,它们都失败了,而只有一些失败。


我直接从示例中获取代码并替换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.');

    });

})();

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


慕桂英4014372
浏览 290回答 1
1回答

慕神8447489

puppeteer-cluster 的作者在这里。来自文档的引用:cluster.queue(..): [...] 请注意,出于向后兼容性的原因,此函数仅返回 Promise。此函数不会异步运行,会立即返回。cluster.execute(...): [...] 就像 一样Cluster.queue,只是这个函数返回一个 Promise,它会在任务执行后被解析。如果在执行过程中发生错误,该函数将拒绝抛出错误的 Promise。不会触发“taskerror”事件。何时使用哪个函数:cluster.queue如果您想对大量作业(例如 URL 列表)进行排队,请使用。任务功能需要通过将结果打印到控制台或将它们存储到数据库来处理存储结果。使用cluster.execute,如果你的任务函数返回一个结果。这仍会将作业排入队列,因此queue除了等待作业完成之外,这就像调用一样。在这种情况下,最常见的是存在“空闲集群”,当请求到达服务器时使用该集群(如您的示例代码中所示)。所以,你肯定要使用cluster.execute作为你要等待任务结果的函数。您看不到任何错误的原因是(如上所述)cluster.queue函数的错误是通过taskerror事件发出的。该cluster.execute错误是直接抛出(无极被拒绝)。最有可能的是,在这两种情况下,您的作业都失败了,但只有在cluster.execute
随时随地看视频慕课网APP

相关分类

Java
我要回答