从celery worker将结果存储到数据库vs return resu

2024-09-28 23:36:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Celery w/Django处理某个任务,该任务返回一个JSON值,该值需要放入模型记录中。现在,我看到两个选项可以将其保存在Django数据库中:

  1. 作为任务签名的一部分传入记录的id。然后芹菜可以用它来update记录。在
  2. 或者,我可以从任务返回结果,并为celeri启用django-dbresult后端,它将位于celeri自己的task\u result表中。这意味着我必须将AsyncResult Id保存在记录中,每当客户机请求该记录时,我都会查找该过程是否完成。在

在我看来,选择1更好,但由于我最近几年没有使用芹菜,我想知道它是否有缺点,和/或方案2更适合哪种情况。在

谢谢!在


Tags: django模型id数据库jsontask选项记录
1条回答
网友
1楼 · 发布于 2024-09-28 23:36:30

不,第一种方法没有问题。在

任务.py 从应用程序模型导入您的\u模型 从芹菜导入任务

@task
def update_model(id):
    model_obj = your_model.objects.get(id=id)
    #do your stuffs here...

视图.py

^{pr2}$

您可以在数据库中使用此示例代码进行原子提交。如果你担心的话。(取自芹菜docs

from functools import partial
from django.db import transaction

from .models import Article, Log
from .tasks import send_article_created_notification

def create_article(request):
    with transaction.atomic():
        article = Article.objects.create(**request.POST)
        # send this task only if the rest of the transaction succeeds.
        transaction.on_commit(partial(
            send_article_created_notification.delay, article_id=article.pk))
        Log.objects.create(type=Log.ARTICLE_CREATED, object_pk=article.pk)

相关问题 更多 >