我發現我可以將任務設置爲在特定時間從here以特定時間間隔運行,但這隻在任務聲明期間完成。如何將任務設置爲動態定期運行?django芹菜:如何設置任務以特定的時間間隔以編程方式運行
回答
時間表是derived from a setting,因此在運行時似乎是不可變的。
您可以使用Task ETAs或許可以完成要查找的內容。這保證你的任務不會在之前運行所需的時間,但不會承諾在指定的時間運行任務 - 如果工作人員在指定的ETA超載,任務可能會在稍後運行。
如果限制是不是一個問題,你可以寫這將首先運行本身就像一個任務:
@task
def mytask():
keep_running = # Boolean, should the task keep running?
if keep_running:
run_again = # calculate when to run again
mytask.apply_async(eta=run_again)
# ... do the stuff you came here to do ...
這種方法的主要缺點是,你是依靠taskstore記住任務在飛行中。如果其中一個在發射下一個失敗之前失敗,那麼該任務將永不再運行。如果您的經紀人沒有堅持到磁盤並且死亡(將所有的飛行任務與它一起),那麼這些任務都不會再次運行。
你可以通過某種事務日誌記錄和週期性的「保姆」任務來解決這些問題,該任務的任務是找到這樣的重複任務,以避免死亡並使其復活。
如果我必須實現你所描述的內容,我認爲這是我將如何處理它。
看到這裏http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
我認爲你不能讓它動態...最好的辦法是創建任務的任務:比如你要運行的東西X秒後即可創建新的d
具有x秒延遲的任務並且在此任務中爲N * X秒延遲創建另一個任務...
celery.task.base.PeriodicTask
定義is_due
它決定了下一次運行的時間。您可以重寫此函數以包含您的自定義動態運行邏輯。在這裏看到的文檔:http://docs.celeryproject.org/en/latest/reference/celery.task.base.html?highlight=is_due#celery.task.base.PeriodicTask.is_due
一個例子:
import random
from celery.task import PeriodicTask
class MyTask(PeriodicTask):
def run(self, **kwargs):
logger = self.get_logger(**kwargs)
logger.info("Running my task")
def is_due(self, last_run_at):
# Add your logic for when to run. Mine is random
if random.random() < 0.5:
# Run now and ask again in a minute
return (True, 60)
else:
# Don't run now but run in 10 secs
return (True, 10)
一旦你定義一個自定義計劃,將其分配給你的任務,asksol有如上所述。
CELERYBEAT_SCHEDULE = {
"my_name": {
"task": "myapp.tasks.task",
"schedule": myschedule(),
}
}
您可能還需要修改CELERYBEAT_MAX_LOOP_INTERVAL如果你想你的日程安排更經常超過每五分鐘更新一次。
- 1. 使用芹菜在特定任務上設置時間限制
- 2. 獲取某些芹菜任務,只在特定時間運行
- 3. 如何以編程方式確定時間間隔狀態
- 4. 在JAVA中以特定時間間隔運行特定時間的線程
- 5. 在短時間內運行芹菜任務(Django)
- 6. 以時間間隔對任務數進行直方圖編排
- 7. 芹菜:以編程方式將任務排隊到特定的隊列?
- 8. 慢芹菜任務時間
- 9. Android:以特定時間間隔以編程方式打開和關閉屏幕
- 10. 如何在特定時間重試芹菜任務?
- 11. 以編程方式設置asp.net計時器間隔
- 12. 以特定時間間隔運行程序
- 13. 以特定的時間間隔以
- 14. 測量芹菜任務執行時間
- 15. 如何設置一個任務以便每隔一段時間運行一次?
- 16. AJAX以設定的時間間隔運行onload並且以設定的時間間隔
- 17. 如何從服務中的線程以特定間隔運行方法...?
- 18. 芹菜/ Django - 如何以編程方式查看工人狀態
- 19. 如何讓我的Windows服務以特定間隔運行?
- 20. Java:以不同的時間間隔運行任務
- 21. C#以不同的時間間隔運行多個任務
- 22. Django的芹菜 - 運行計劃任務
- 23. 如何以編程方式設置iOS設備時間?
- 24. 在蟒蛇在特定時間間隔運行任務
- 25. 以特定時間間隔(包括秒)計劃任務
- 26. 以編程方式將DatePicker時間設置爲當前時間
- 27. 以固定的時間間隔重複執行任務
- 28. 動態更改芹菜任務的週期性間隔運行時
- 29. 如何以隨機時間間隔執行任務?
- 30. 如何以編程方式更改BIOS時間設置?
是的,調度程序沒有針對動態調度進行優化,但是您可以使用上面描述的'is_due'方法實現您自己的'Schedule',同時讓任務重新調度本身也是許多使用的選項,但是您需要確保始終觸發第一項任務,這並不容易。另一種選擇是在django-celery中使用DatabaseScheduler,它支持動態調度,也可以在Django項目之外使用。另外,創建自己的調度程序並不困難。 – asksol
@asksol,django-芹菜的文件是空的。我在哪裏可以找到如何使用databaseScheduler? – goh
@amateur呃,這裏的文檔真的很稀少: – asksol