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

标签 python django postgresql asynchronous celery

我正在使用 Celery 构建 Django 应用。

我有一个 @task,我用 .delay() 触发它。

任务完成后,我需要使用返回值(一个字符串)来更新我的 Postgres 数据库。

我不确定应该将数据库更新代码放在哪里?

我会做吗:

一)

return_value = my_task.delay(..)
(ORM - DB update code)

二)

my_task.delay(..) # <-- Task updates the DB.

这里哪个是 Pythonic 的正确方法?

最佳答案

您应该使用第二种方法,因为延迟方法会立即退出,而无需等待您的任务完成。而 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

关于python - Celery:何时何地使用运行@task 的.delay() 的返回值来更新数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23221402/

相关文章:

python - 将元组列表转换为系列的最快方法

Python CGI 队列

python - 使用 datetime.timedelta 添加年份

Python:如何在处理其他异常的同时忽略异常

python - Django:TypeError:必须是字符串,而不是 datetime.date

sql - 字符 1 处或附近的 "EXERCISE_ID"处出现 postgresql 语法错误

python - 如果我在断点处停止,异常就会消失

python - Django 模板表达式中的 "bar"是文字吗?

postgresql - 如何用空值替换非ascii字符

python - flask -SQLAlchemy, "Application not registered on db"