gpt4 book ai didi

javascript - puppeteer-cluster:队列而不是执行

转载 作者:搜寻专家 更新时间:2023-11-01 00:47:38 28 4
gpt4 key购买 nike

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

我直接从 examples 中提取了代码并将 execute 替换为 queue 我希望它能工作,除了代码不等待结果。有没有办法实现这一目标?

所以这是可行的:

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

但这打破了:

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

这是队列的完整示例:

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.');
});
})();

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

最佳答案

作者 puppeteer-cluster在这里。

引自文档:

cluster.queue(..): [...] Be aware that this function only returns a Promise for backward compatibility reasons. This function does not run asynchronously and will immediately return.

cluster.execute(...): [...] Works like Cluster.queue, just that this function returns a Promise which will be resolved after the task is executed. In case an error happens during the execution, this function will reject the Promise with the thrown error. There will be no "taskerror" event fired.

何时使用哪个函数:

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

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

可见

关于javascript - puppeteer-cluster:队列而不是执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com