> 本文首發於公眾號:Hunter後端 > 原文鏈接:[celery筆記四之在Django中使用celery](https://mp.weixin.qq.com/s/O-vHxvDbU6aSGM63GwLLdw) 這一篇筆記介紹一下如何在 Django 系統中使用 celery。 如果是想純粹使用 ...
本文首發於公眾號:Hunter後端
原文鏈接:celery筆記四之在Django中使用celery
這一篇筆記介紹一下如何在 Django 系統中使用 celery。
如果是想純粹使用 celery,這一篇筆記可以略過。
本篇筆記目錄如下:
- 文件配置
- task 定義
- 運行 worker
1、文件配置
我們這裡使用前面的創建的 hunter Django 系統。
我們需要在 settings.py 所在的文件夾下配置如下幾個文件:
hunter/hunter/
/__init__.py
/celery.py
/settings.py
其中,celery.py 文件是我們需要新建的,其他的兩個我們需要新增一點配置項。
以下是 celery.py 文件內容:
# hunter/hunter/celery.py
import os
from celery import Celery
# 為 celery 程式設置預設的 Django 配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hunter.settings')
app = Celery('hunter')
# 表示從 Django 的配置中載入 celery 的配置,namespace='CELERY' 表示 celery 的配置必須是以 'CELERY' 為首碼
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.update(
task_ignore_result=True
)
# 我們需要設置的定時任務 或者 延時任務都可以在對應的 application 下定義,task 的定義我們在下麵介紹
# 然後通過下麵的命令自動發現對應的任務
# 比如想要在 blog 下設置一個延時任務,可以創建 blog/tasks.py,然後 celery 就可以自己發現對應的任務
app.autodiscover_tasks()
在 Django 的 celery.py 里,不一樣的是,os.environ.setdefault() 函數設置了一個 Django 的配置
對 Celery() 實例化的時候,用到的是 Django 的系統名稱 hunter
而這裡使用到的 config_from_object() 用到的值是 'django.conf:settings',namespace 的值是 'CELERY',表示在 settings.py 中所有 CELERY 開頭的值都可以被捕捉到並作為 celery 的配置項,這個我們等下介紹。
最後面有一個 app.autodiscover_tasks() 表示Django 系統將會自動獲取 Django 系統下各個 application 的 tasks.py 的 task。
以上就是一個最基本的使用模板。
settings.py
在 settings.py 中的配置如下:
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_BROKER_URL = "redis://localhost/0"
CELERY_RESULT_BACKEND = "redis://localhost/1"
其中,所有的關於 celery 的配置都需要加上 CELERY_ 的首碼,參數值的定義和之前 celeryconfig.py 中的定義方式是一致的。
還有很多其他的配置項對應值,詳見下麵的鏈接:celery配置項
除此之外,為了確保 celery 的 app 在 Django 運行的時候被載入,我們還需要在 hunter/hunter/init.py 中引入 celery_app。
# hunter/hunter/__init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)
這樣,每個 application 下的 tasks.py 中被 @shared_task 修飾的延時或定時任務就可以使用了。
2、task 定義
假設我們還是沿用之前的 application,命名為 blog,我們在這個文件夾下創建一個 tasks.py,內容如下:
# blog/tasks.py
from celery import shared_task
@shared_task
def test_add(x, y):
return x + y
在 Django 的 tasks 里我們會把 task 都寫在可重覆使用的 app 下,比如 blog,但是這些 app 不能依賴於項目本身,所以不能直接引入這些app實例
@shared_task 裝飾器可以讓你在不需要任何具體的 app 實例的情況下創建 task
以上是官方文檔給出的一段介紹,u1s1,我不太理解這段話的含義,但是我們照做就行了,就是在 Django 的 task 中,我們使用 @shared_task 來修飾那些 task 即可。
就此,我們將 celery 融入 Django 的操作就完成啦!
3、運行 worker
我們還是需要單獨將 worker 運行起來才可以調用延時任務
我們在 Django 系統的根目錄下,也就是 hunter/ 下,執行:
celery -A hunter worker -l INFO
然後新開一個 shell,在 Django 系統的根目錄下進入 Django 的 shell,也就是使用 python3 manage.py shell,然後調用 task:
from blog.tasks import test_add
test_add.delay(1, 2)
關於 celery 與 Django 的融合,還有一些其他操作,比如將 task 運行的 result 寫入 Django 的表,使用 Django 的表來設置定義任務等,這個我們後面再單開筆記來詳細介紹。
如果想獲取更多後端相關文章,可掃碼關註閱讀: