本文首發於公眾號:Hunter後端
原文連結:celery筆記四之在Django中使用celery
這一篇筆記介紹一下如何在 Django 系統中使用 celery。
如果是想純粹使用 celery,這一篇筆記可以略過。
本篇筆記目錄如下:
我們這裡使用前面的建立的 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 修飾的延時或定時任務就可以使用了。
假設我們還是沿用之前的 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 的操作就完成啦!
我們還是需要單獨將 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 的表來設定定義任務等,這個我們後面再單開筆記來詳細介紹。
如果想獲取更多後端相關文章,可掃碼關注閱讀: