我试图编写一个基本任务类,它会在工作之前检查工作人员的可用性。 通过在此处阅读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)
答案 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)