在每个Celery Task运行中执行某些操作

时间:2016-07-06 15:44:23

标签: python celery

假设我有一些基于一个抽象任务的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

我想在每个任务执行开始时做点什么。有没有可能实现这个结果?感谢。

2 个答案:

答案 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

这是关于前/后任务回调的另一个有用的帖子。

https://gist.github.com/nuria/35f332acfb84ecf80e3b