Celery:何时何地使用运行@task的.delay()的返回值来更新数据库?

Phi*_*hil 2 python django postgresql asynchronous celery

我正在用Celery构建一个Django应用程序.

我有一个@task我开的.delay().

任务完成后,我需要使用返回值(字符串)来更新我的Postgres DB.

我不知道我应该在哪里放置数据库更新代码?

我这样做:

一个)

return_value = my_task.delay(..)
(ORM - DB update code)
Run Code Online (Sandbox Code Playgroud)

b)

my_task.delay(..) # <-- Task updates the DB.
Run Code Online (Sandbox Code Playgroud)

这是Pythonic的正确方法?

iso*_*lev 7

您应该使用第二种方法,因为延迟方法立即退出而无需等待您的任务完成.return_value变量将是AsyncResult实例,而不是您想要从my_task返回的值.因此,如果要在任务完成后更新数据库,请在任务内部执行此操作.

或者,您可以使用Task类的on_success处理程序:

class MyTask(Task):

    def run(self, *args, **kwargs):
        # your task execution code

    def on_success(self, retval, task_id, args, kwargs):
        # put the retval into the DB
Run Code Online (Sandbox Code Playgroud)