首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >傀儡-集群:队列而不是执行

傀儡-集群:队列而不是执行
EN

Stack Overflow用户
提问于 2019-08-05 14:51:39
回答 1查看 5.3K关注 0票数 3

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

我直接从示例中提取了代码,并将execute替换为我期望工作的queue,除非代码不等待结果。有什么办法可以做到这一点吗?

因此,这是可行的:

代码语言:javascript
复制
const screen = await cluster.execute(req.query.url);

但这打破了:

代码语言:javascript
复制
const screen = await cluster.queue(req.query.url);

下面是queue的完整示例

代码语言:javascript
复制
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.');
    });
})();

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-05 16:12:38

木偶技师-集群的作者。

引用文档:

cluster.queue(..):...请注意,此函数只返回向后兼容性的承诺。此函数不异步运行,并将立即返回。 cluster.execute(...):...它的工作方式类似于Cluster.queue,只是这个函数返回的承诺将在任务执行后得到解决。如果在执行过程中发生错误,此函数将拒绝抛出错误的承诺。不会触发"taskerror“事件。

何时使用哪个函数:

  • 如果希望对大量作业(例如URL列表)进行排队,请使用cluster.queue。任务函数需要通过将结果打印到控制台或将其存储到数据库中来存储结果。
  • 如果任务函数返回结果,请使用cluster.execute。这仍然会使作业排队,所以除了等待作业完成外,这就像调用queue一样。在这个场景中,最常见的情况是出现一个“空闲集群”,当请求到达服务器时(如示例代码中所示)。

因此,您肯定希望使用cluster.execute,因为您希望等待任务函数的结果。您没有看到任何错误的原因是(如前所述),cluster.queue函数的错误是通过taskerror事件发出的。直接抛出cluster.execute错误(拒绝承诺)。最有可能的是,在这两种情况下,您的工作都失败了,但它只对cluster.execute可见。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57361073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档