celery任务与django查询集缓存

2 投票
1 回答
1696 浏览
提问于 2025-04-19 01:50

我正在尝试让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()

现在,每当我运行一个涉及数据库查询的任务时,比如:

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))

我能在celery的监控工具(flower)中看到这个任务,但实际的http响应并没有更新结果。即使我不停刷新,结果也只是偶尔更新,这让我觉得不太可靠。

更奇怪的是,在真实的服务器上(我用的是apache),刷新似乎没有用,尽管flower显示“成功”。当我进入命令行(用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 个回答

2

你的数据库缓存没有问题。问题在于你在 HttpResponse 中读取并返回值的时候,Celery 还没来得及执行这个任务。调用 task.delay() 是一个异步操作,它会创建一个任务并 立刻返回。真正的任务需要由一个工作者去处理和执行,这个过程通常会有一些延迟。

你可以通过多种方法来解决这个问题,比如使用 Javascript 和 AJAX,在任务完成后更新前端页面。

撰写回答