本文首發于公眾號: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 的表來設定定義任務等,這個我們后面再單開筆記來詳細介紹,
如果想獲取更多后端相關文章,可掃碼關注閱讀:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555248.html
標籤:其他
下一篇:返回列表