這裏是我的設置:如何判斷任務是否已在django-celery中排隊?
- 的Django 1.3
- 芹菜2.2.6
- Django的芹菜2.2.4
- djkombu 0.9.2
在我的settings.py文件我有
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
即我只是usi使數據庫排隊任務。
現在到我的問題:我有一個用戶啓動的任務,可能需要幾分鐘才能完成。我希望任務只能爲每個用戶運行一次,並且我會將任務的結果緩存到一個臨時文件中,這樣如果用戶再次啓動任務,我只需返回緩存的文件。我在我的視圖函數中看起來像這樣的代碼:
task_id = "long-task-%d" % user_id
result = tasks.some_long_task.AsyncResult(task_id)
if result.state == celery.states.PENDING:
# The next line makes a duplicate task if the user rapidly refreshes the page
tasks.some_long_task.apply_async(task_id=task_id)
return HttpResponse("Task started...")
elif result.state == celery.states.STARTED:
return HttpResponse("Task is still running, please wait...")
elif result.state == celery.states.SUCCESS:
if cached_file_still_exists():
return get_cached_file()
else:
result.forget()
tasks.some_long_task.apply_async(task_id=task_id)
return HttpResponse("Task started...")
此代碼幾乎可用。但是當用戶快速重新加載頁面時,我遇到了一個問題。任務排隊和任務最終從隊列中取出併發給工作人員之間的延遲爲1-3秒。在此期間,任務的狀態保持爲PENDING,這會導致視圖邏輯啓動重複的任務。
我需要的是某種方式來判斷任務是否已經提交給隊列,所以我最終沒有提交兩次。芹菜中有這樣做的標準方法嗎?
可以'kick_off_the_long_task_again()'檢查以確保任務移出待定?如果是這樣,這可能足以延遲用戶和芹菜之間的競爭條件。 – 2011-05-04 19:19:54
kick_off_the_long_task_again()不會導致重複的任務。我更新了我的示例以顯示代碼將執行重複任務的位置。 – cwick 2011-05-04 19:34:00
這不是我的問題。可以'kick_off_the_long_task_again()'檢查並等待確定任務在完成之前移出待定嗎? – 2011-05-04 19:42:09