假设我有一些基于一个抽象任务的Celery任务。
class BaseTask(Task):
abstract = True
def on_failure(self, exc, task_id, args, kwargs, einfo):
logging.info('Task failed')
def on_success(self, retval, task_id, args, kwargs):
logging.info('Task success')
# NO SUCH METHOD IN TASK
# def on_start(self):
# do_something_on_every_task_start()
@app.task(base=BaseTask)
def task1(x):
print x
@app.task(base=BaseTask)
def task2(y):
print y
我想在每个任务执行开始时做点什么。有没有可能实现这个结果?感谢。
答案 0 :(得分:4)
您可以覆盖__call__
方法。如果您使用task1(1)
同步调用任务或使用task1.delay(1)
异步调用任务,这将同时发挥作用。在以下示例中,您将获得“CALLED!”在控制台或日志中,具体取决于您如何调用任务以及如何设置日志记录。
class BaseTask(Task):
abstract = True
def __call__(self, *args, **kwargs):
print "CALLED!"
return super(BaseTask, self).__call__(*args, **kwargs)
@app.task(base=BaseTask)
def task1(x):
print x
@app.task(base=BaseTask)
def task2(y):
print y
答案 1 :(得分:0)
如果需要'语义上很漂亮'方法,你可以尝试信号。
http://docs.celeryproject.org/en/latest/userguide/signals.html
这是关于前/后任务回调的另一个有用的帖子。