我遇到了從另一個芹菜任務執行芹菜任務的問題。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()調用是否可以異步阻止對該行/對象的訪問?
如果數據對象已經存在,那麼你不應該得到那個錯誤 - 如果有一個塊,那麼如果有一些錯誤配置,你可能會看到超時。在不使用'countdown'的情況下是否使用'apply_async()'? – scytale
我猜你的調用者在芹菜開始處理任務之前沒有提交的事務中。因此芹菜找不到記錄。這就是爲什麼添加倒數計時器使其工作。 1秒鐘倒計時是否工作?我在整個代碼中使用了1秒倒計時來處理這個問題。其他解決方案是停止使用事務。 – Lee
您使用的是哪個版本的Django? –