gpt4 book ai didi

node.js - 如何正确设置议程作业并发

转载 作者:行者123 更新时间:2023-12-02 03:00:42 26 4
gpt4 key购买 nike

这是一个示例作业:

const Agenda = require('agenda')
const agenda = new Agenda({db: {address: process.env.MONGO_URL}})

agenda.define('example-job', (job) => {
console.log('took a job -', job.attrs._id)
})

现在,假设我像这样排队 11 个议程作业:

const times = require('lodash/times')
times(11, () => agenda.now('example-job'))

现在,如果我查看数据库,我可以看到有 11 个作业在排队等待处理(如我所料)。

所以现在我启动一个工作进程:

agenda.on('ready', () => {
require('./jobs/example_job')
agenda.start()
})

当该进程启动时,我看到 5 个作业从队列中拉出,这是有道理的,因为 defaultConcurrency 是 5 https://github.com/agenda/agenda#defaultconcurrencynumber

到目前为止一切顺利,但如果我启动另一个工作进程(与上面的相同),我预计会有 5 个以上的作业从队列中拉出,因此总共有 10 个正在运行(每个进程 5 个),并且一个留在队列中。

但是,当第二个 worker 启动时,它不会再拉下任何工作,它只是闲置。

我希望 defaultConcurrency 是在任何给定时刻每个进程 可以运行的作业数量,但它看起来像是一个适用于该数量的设置在所有议程流程中随时汇总的工作。

我在这里遗漏了什么,或者指定每个进程可以运行多少作业的正确方法是什么,而不限制可以在所有进程中运行的作业数量。

最佳答案

问题是需要设置defaultLockLimit

默认情况下,lock limit 为 0,即无限制,即一个 worker 将锁定所有可用的作业,不允许其他 worker 认领。

通过将 defaultLockLimit 设置为与 defaultConcurrency 相同的值,这可以确保工作人员只会锁定它正在积极处理的作业。

参见:https://github.com/agenda/agenda/issues/412#issuecomment-374430070

关于node.js - 如何正确设置议程作业并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46349947/

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