【问题标题】:celery force all celery processes to run taskcelery 强制所有 celery 进程运行任务
【发布时间】:2016-03-09 22:07:46
【问题描述】:

我有一个包含多个 EC2 的设置,并且我在所有这些上都运行了 celery。我还有一个盒子,上面运行着celerybeat。我可以让celerybeat 与在其余celery 客户端上运行的任务一起运行。

有没有办法让所有 celery 实例必须运行的必需任务?用例将是清除日志、对盒子运行基本的健全性检查等。

我已阅读以下内容:

http://docs.celeryproject.org/en/latest/userguide/workers.html

【问题讨论】:

    标签: django celery


    【解决方案1】:

    实际上 celery 的工作原理不是推式系统,而是拉式系统。

    您只需将一个任务放入队列中,一个可用的工作人员就会得到它并执行。

    根据您的问题,我假设在instances 下,您的意思是servers 在其芹菜的workers 上运行。因此,您希望在所有服务器上运行相同的任务。

    我认为你只能放一些任务(对应服务器号),并为每个任务指定准确的路由号(与worker的id相同)。

    mytask.apply_async(kwargs={'a': 1, 'b': 2}, routing_key='aaabbc-dddeeff-243453')
    mytask.apply_async(kwargs={'a': 1, 'b': 2}, routing_key='bbbbbb-fffddd-dabcfe')
    ...
    

    【讨论】:

      【解决方案2】:

      Broadcast

      Celery 还可以支持广播路由。这是一个 示例交换广播任务,将任务副本传递给所有人 与之相连的工作人员:

      从kombu.common导入广播

      CELERY_QUEUES = (Broadcast('broadcast_tasks'), )

      CELERY_ROUTES = {'tasks.reload_cache': {'queue': 'broadcast_tasks'}} 现在 tasks.reload_cache 任务将被发送给每个消耗 从这个队列中。

      【讨论】:

        猜你喜欢
        • 2015-10-24
        • 2021-12-16
        • 2017-02-02
        • 2020-05-03
        • 2011-09-15
        • 2019-02-16
        • 2014-03-17
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多