从celery worker到结果存储结果到数据库

时间:2017-04-13 00:00:38

标签: python django celery

我使用Celery和Django来处理某个任务,该任务返回需要放入Model记录的JSON值。现在我看到有两个选项可以将它保存在Django数据库中:

  1. 作为任务签名的一部分传入记录的id。然后Celery可以使用它来记录update
  2. 或者,我可以从任务中返回结果并为Celery启用django-db结果后端,后端将存在于Celery自己的task_result表中。这意味着我必须在记录中保留AsyncResult Id,并且每当客户端请求记录时,我都会查看并查看该过程是否完成。
  3. 对我而言,似乎选项1更好,但由于我近年来没有与Celery合作过,我想知道它是否有缺点,和/或选项2哪种情况更适合

    谢谢!

1 个答案:

答案 0 :(得分:1)

第一种方法没有任何问题。

<强> tasks.py     从app.models导入your_model     来自芹菜进口任务

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

<强> views.py

from app.tasks import update_model

def your_view(request):
    #your code
    update_model.delay(id_of_the_instance_you_want_to_update)

您可以将此示例代码用于数据库中的原子提交。如果您担心(取自芹菜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)