2015-08-26 40 views
3

我遇到了從另一個芹菜任務執行芹菜任務的問題。Django與芹菜 - 現有的對象沒有找到

這裏是有問題的片段(數據對象已存在於數據庫,其屬性剛剛更新finalize_data函數內部):

def finalize_data(data): 
    data = update_statistics(data) 
    data.save() 
    from apps.datas.tasks import optimize_data 
    optimize_data.delay(data.pk) 

@shared_task 
def optimize_data(data_pk): 
    data = Data.objects.get(pk=data_pk) 
    #Do something with data 

在optimize_data函數獲取調用失敗「數據匹配查詢不存在的。」

如果我在finalize_data函數中調用pk函數檢索它可以正常工作。如果我延遲一段時間的芹菜任務調用,它也可以正常工作。

這行:

optimize_data.apply_async((data.pk,), countdown=10) 

代替

optimize_data.delay(data.pk) 

工作正常。但我不想在我的代碼中使用黑客。 .save()調用是否可以異步阻止對該行/對象的訪問?

+0

如果數據對象已經存在,那麼你不應該得到那個錯誤 - 如果有一個塊,那麼如果有一些錯誤配置,你可能會看到超時。在不使用'countdown'的情況下是否使用'apply_async()'? – scytale

+0

我猜你的調用者在芹菜開始處理任務之前沒有提交的事務中。因此芹菜找不到記錄。這就是爲什麼添加倒數計時器使其工作。 1秒鐘倒計時是否工作?我在整個代碼中使用了1秒倒計時來處理這個問題。其他解決方案是停止使用事務。 – Lee

+0

您使用的是哪個版本的Django? –

回答

2

我猜你的調用者是在芹菜開始處理任務之前沒有提交的事務中。因此芹菜找不到記錄。這就是爲什麼添加倒數計時器使其工作。

在你的例子中,1秒的倒計時可能會和10秒倒計時一樣。我在整個代碼中使用了1秒倒計時來處理這個問題。

另一種解決方案是停止使用事務。

1

我知道這是舊帖子,但今天我偶然發現了這個問題。李的回答指出了正確的方向,但我認爲今天有更好的解決方案。

使用Django提供的on_commit處理程序,可以解決這個問題,而不需要在代碼中進行倒計時的方式,這可能對用戶不直觀,關於它存在的原因。

我不確定問題發佈時是否存在,但我只是發佈答案,以便將來到這裏的人知道替代方案。