2014-08-31 66 views
2

我想讓芹菜工作,但我有一些問題,我不太明白。芹菜任務和Django查詢集緩存

我從第三方軟件包

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

我看到任務芹菜(花)彈出,但實際的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)) 

回答

2

有你的數據庫緩存沒有問題。問題在於,您正在讀取價值並將其返回,之後Celery纔有機會運行它task.delay()是創建作業的異步調用,並且立即返回。實際的工作需要由工作人員拾取並執行,這經常發生在一些處理延遲的情況下。

您可以使用各種方法解決這個問題,例如,一旦工作完成,使用Javascript和AJAX更新前端。

+0

雖然有效你的觀點似乎並沒有引起問題。我看到工作幾乎立即完成(芹菜花),正如我所覆蓋的,刷新似乎沒有幫助的Apache網絡服務器,但謝謝我將進一步調查 – user2298943 2014-08-31 14:21:37

+0

小心解釋結果說工作**完成* *。默認情況下,當彈出隊列時,任務將立即被**確認**,除非通過設置'acks_late'開關明確指定它們是冪等的。在這裏閱讀更多信息:http://celery.readthedocs.org/en/latest/userguide/tasks.html – 2014-08-31 15:14:48