【问题标题】:How do I ensure that a celery task is run serially on a worker?如何确保芹菜任务在工人身上连续运行?
【发布时间】:2012-08-17 13:30:18
【问题描述】:

我有一个 celery 任务,它进行子进程调用,只能在系统范围内并行运行。虽然我想出了一个更好的解决方案,但我需要能够执行在单个工作人员上串行运行的任务。

我知道我可以创建一个表来跟踪当前正在运行任务的服务器,并等待它完成,然后再运行未来的任务,但似乎必须有更好的方法。我已经非常广泛地查看了 celery 文档,并简要地查看了 rabbitmq 文档,但无济于事。

有没有人想出一个优雅的解决方案来解决这个问题,并与上述技术的一些隐藏特性挂钩?

【问题讨论】:

  • 你能澄清一下你的设置吗?您有多个服务器,每个服务器运行一个 celery worker,但您不希望它们并行执行 - 对吗?你只有一个 rabbitmq 服务器在运行吗?
  • @dgel:一台rabbitmq服务器,有多个worker。

标签: django rabbitmq celery django-celery


【解决方案1】:

如果你在 django 中设置了一个database cache,它使用所有服务器通用的数据库,你可以实现这个celery cookbook solution for executing one task at time。不要使用变量lock_id,而是使用常量。

如果锁对执行任务的工作人员不可用,请调用retry 将任务放回队列。

【讨论】:

  • 我认为这是我必须要做的。您是否知道如何在任务中获取工作人员的唯一标识符?
  • @sdolan: 嗯...不幸的是没有。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 2014-07-14
  • 2019-07-26
  • 2011-12-29
  • 2021-02-21
相关资源
最近更新 更多