为芹菜写一个基本任务,知道工人是否在工作

时间:2014-07-31 10:06:55

标签: python task celery worker

我试图编写一个基本任务类,它会在工作之前检查工作人员的可用性。 通过在此处阅读this帖子,我提出了以下内容:

class BaseTask(Task):
    def apply_async(self, *args, **kwargs):
        if not celery.control.inspect().stats():
            raise Exception("workersDown")
        Task.apply_async(self, *args, **kwargs)

然而,这似乎只是第一次有效。 我知道task is not instantiated each time,但它有关系吗? 有没有其他方法可以达到我的目的?

修改

我发现将基本任务设置为抽象有帮助,但仍然会产生一些误报(尽管工作人员已经启动,但有时会引发异常):

class AnotherTask(Task):
    abstract = True

    def apply_async(self, *args, **kwargs):
        if not celery.control.inspect().stats():
            raise Exception("workersDown")
        Task.apply_async(self, *args, **kwargs)

1 个答案:

答案 0 :(得分:0)

对于给定的芹菜应用实例,您只能调用inspect()一次。下面是一个小代码片段,您可以在任务中使用它:

from celery import Celery

def inspect(method):
    app = Celery('app', broker='amqp://')
    return getattr(app.control.inspect(), method)()


class BaseTask(Task):
    def apply_async(self, *args, **kwargs):
        if not inspect('stats'):
            raise Exception("workersDown")
        Task.apply_async(self, *args, **kwargs)