我试图让个别任务在压力测试期间超时,看看我的调用程序会做什么。但是,我的集群可以无限期地保持任务新鲜。它似乎将我所有的cluster.execute
呼叫排队,然后将其保存在内存中,并将其结果返回给早已断开连接的听众。
文档状态:
timeout <number> Specify a timeout for all tasks. Defaults to 30000 (30 seconds).
我的集群启动配置:
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT,
maxConcurrency: 1,
timeout: 1000 //milliseconds
});
我正在使用以下方法调用排队机制:
const pdf = await cluster.execute(html, makePdf);
其中 makePdf 是一个async
需要 HTML 字符串的函数,用它填充页面并使用默认的puppeteer
.
const makePdf = async ({ page, data: html, worker }) => {
await page.setContent(html);
let pdf = await page.pdf({});
console.log('worker ' + worker.id + ' task ' + count);
return pdf;
};
我有点期望队列开始清空自己,直到它找到一个不超过其超时值的任务。我尝试将其设置timeout
为 1 毫秒,但这也不会触发超时。我已尝试将此代码移至cluster.task
示例中所述的 a 以查看是否会触发设置,但没有这样的运气。如何让已经排队的请求超时?如果我不抓取网站或连接到任何东西,这是否有效?
我正在考虑将时间戳与我的任务一起传递,以便它可以跳过对调用方已过期的请求执行任何操作,但我宁愿尽可能使用内置选项。
编辑:
感谢 Thomas 的澄清,我决定构建这个小优化,以防止侦听器长期执行的任务。
data
将html 的内容与包含 url 和时间戳的 json交换:
let timestamp = new Date();
await cluster.execute({html, timestamp});
忽略侦听器超时的任何排队任务:
const makePdf = async ({ page, data: { html, timestamp }, worker }) => {
let time_since_call = (new Date() - timestamp);
if (time_since_call < timeout_ms) {
await page.setContent(html);
let pdf = await page.pdf({});
return pdf;
}
};