首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >芹菜限制队列中特定任务的数量

芹菜限制队列中特定任务的数量
EN

Stack Overflow用户
提问于 2015-05-27 19:57:11
回答 2查看 1.3K关注 0票数 2

我用芹菜3.1.x做两个任务。第一个任务(TaskOne)是在芹菜通过celeryd_after_setup信号启动时排队的:

代码语言:javascript
运行
复制
@celeryd_after_setup.connect
def celeryd_after_setup(*args, **kwargs):
    TaskOne().apply_async(countdown=5)

运行TaskOne时,它会进行一些计算,然后对TaskTwo进行排队。想象一下以下工作流:

  • 我启动芹菜,因此信号被发射,TaskOne被排队。
  • 倒计时(5)之后,TaskTwo被排队
  • 然后我停止了芹菜( TaskTwo仍在排队)
  • 之后我重新开始吃芹菜
  • 工作流再次运行,TaskTwo再次排队。

所以我们在队列中有两个TaskTwo。这对我的工作流来说是个问题,因为我只希望队列中有一个TaskTwo,并且避免第二个被排队。

我的问题是:我怎样才能做到这一点?

有了celery.app.control.Inspect.scheduled() (文档),我就可以得到一个任务的列表,它隐藏在列表和dicts的组合中。这也许是一种方式,但通过这一结果并不是正确的。还有更好的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-28 15:58:08

在考虑了几个选项之后,我选择了使用app.control.inspect。这不是一个很好的解决方案,但它有效:

代码语言:javascript
运行
复制
# fetch all scheduled tasks
scheduled_tasks = inspect().scheduled()

# iterate the scheduled task values, see http://docs.celeryproject.org/en/latest/userguide/workers.html?highlight=revoke#dump-of-scheduled-eta-tasks
for task_values in iter(scheduled_tasks.values()):
    # task_values is a list of dicts
    for task in task_values:
        if task['request']['name'] == '{}.{}'.format(TaskTwo.__module__, TaskTwo.__name__):
            logger.info('TaskTwo is already scheduled, skipping additional run')
                return
票数 0
EN

Stack Overflow用户

发布于 2015-05-28 06:09:25

一个易于实现的解决方案是将-清洗开关添加到worker命令中。它将清除队列,并且工作人员将在没有计划作业的情况下启动。

但要小心:这是一种全球性的、不可挽回的行动。当有其他您所依赖的计划作业时,这不是您的解决方案。

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

https://stackoverflow.com/questions/30491998

复制
相关文章

相似问题

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