繁体   English   中英

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

[英]Celery limit number of specific task in queue

我正在使用Celery 3.1.x执行2个任务。 当Celery通过celeryd_after_setup信号启动时,第一个任务(TaskOne)入队:

@celeryd_after_setup.connect
def celeryd_after_setup(*args, **kwargs):
    TaskOne().apply_async(countdown=5)

运行TaskOne时,它将进行一些计算,然后使TaskTwo入队。 想象以下工作流程:

  • 我开始芹菜,因此信号被发射并且TaskOne被排队
  • 倒数计时(5)在TaskTwo入队后
  • 然后我停止芹菜(TaskTwo仍然在队列中)
  • 之后我重启芹菜
  • 工作流再次运行,TaskTwo再次入队

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

我的问题:我该如何实现?

使用celery.app.control.Inspect.scheduled()Docs ),我可以获取已计划的任务列表,并隐藏在列表和字典的组合中。 这也许是一种方法,但是经历这种结果并不正确。 有什么更好的办法吗?

一个易于实现的解决方案是将--purge开关添加到worker命令中。 它将清除队列,并且工作程序从没有计划的作业开始。

但是请注意:这是一种作业全局性的,不可恢复的动作。 如果您要依靠其他预定的作业,那不是您的解决方案。

考虑了几个选项后,我选择使用app.control.inspect 这不是一个非常漂亮的解决方案,但是它可以工作:

# 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM