celery任务与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()
现在,每当我运行一个涉及数据库查询的任务时,比如:
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,在任务完成后更新前端页面。