背景
最近寫 Django
時遇到個問題,就是要使用 Celery
進行定時任務觸發。在配置任務函數時老是無法自動發現註冊過的任務。最終花了點心思,研究了下源碼才解決。在這裏記錄下注意點
在使用 Celery
提供的 autodiscover_tasks
方法來自動發現任務時,默認是發現在 settings
模塊裏註冊過的應用下的 tasks
模塊中包含的被 Celery
的 task()
裝飾器裝飾過的任務函數。
而我想將這些任務函數分開放在不同的模塊下,按照包的方式進行管理。這裏就存在三個坑,需要注意下。
注意點
- 爲了儘量減少對
Celery
默認邏輯的修改,包名應該爲tasks
。 - 存在
__init__
模塊的目錄纔是Python
包。記得創建一個空的__init__.py
文件。 - 包中定義的任務,都需要在
__init__
模塊中進行導入,最好將這些被導入的任務函數包含在__all__
列表中,來避免被flake8
掃出警告。