我想让芹菜上班,但我有一些问题,我不太明白。
我从第三方软件包继承模型
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))
答案 0 :(得分:2)
您的数据库缓存没有问题。问题是,在Celery有机会运行之前,您正在阅读该值并将其返回HttpResponse
。 task.delay()
是一个异步调用,用于创建作业,立即返回。实际工作需要由工人接收并执行,这通常会在一些处理延迟时发生。
您可以使用各种方法解决此问题,例如一旦工作完成,使用Javascript和AJAX更新前端。