celery task和django queryset cache

时间:2014-08-31 10:16:03

标签: python mysql django celery

我想让芹菜上班,但我有一些问题,我不太明白。

我从第三方软件包继承模型

class BaseModel(models.Model):
    class Meta:
        abstract = True

    def do(self, a=1, b=2):
        return a + b

然后;

from thirdpartypackage.models import BaseModel

class MyModel(BaseModel):
    some_field = models.IntegerField(default=0)

    @current_app.task(filter=task_method):
    def do(self, a=1, b=1):
        self.some_field = super(MyModel, self).do(a=a, b=b)
        self.save()

现在每当我运行涉及db查询的任务时,例如:

def my_view(request, pk=None):
    obj = get_object_or_404(MyModel, pk=pk)

    obj.do.delay(a=2, b=4)

    return HttpResponse('the answer is: {}'.format(obj.some_field))

我看到芹菜(花)中弹出了任务,但实际的http响应没有更新结果,在我大量刷新之后我看到了结果更新,虽然这似乎不可靠。

更奇怪的是,在一台真正的服务器上(在我的情况下是apache)这似乎没有做到这一点(令人耳目一新),尽管花说“成功”。当我进入shell(python manage.py shell)并直接调用该作业时,我确实立即看到了结果。

有什么关于django的/ mysql缓存我应该知道吗?如何强制更新?

如果我直接调用该函数(没有延迟),它会按预期立即运行:

def my_view(request, pk=None):
    obj = get_object_or_404(MyModel, pk=pk)

    obj.do(a=2, b=4)

    return HttpResponse('the answer is: {}'.format(obj.some_field))

1 个答案:

答案 0 :(得分:2)

您的数据库缓存没有问题。问题是,在Celery有机会运行之前,您正在阅读该值并将其返回HttpResponse task.delay()是一个异步调用,用于创建作业,立即返回。实际工作需要由工人接收并执行,这通常会在一些处理延迟时发生。

您可以使用各种方法解决此问题,例如一旦工作完成,使用Javascript和AJAX更新前端。