隨着Web應用程序的規模和複雜性的增加,執行一些長時間運行的任務,例如數據清理,報表生成等不適宜放到Web請求周期中,而應該作為一項後台處理任務進行。對於這類任務,我們通常使用Celery作為任務隊列,但Celery本身不提供定時任務調度的功能,因此需要使用Celery Beat。
一、安裝Django Celery Beat
首先,我們需要安裝Django Celery Beat:
pip install django-celery-beat
並將其添加到INSTALLED_APPS中:
# settings.py
INSTALLED_APPS = [
...
'django_celery_beat',
]
二、配置Celery Beat
要在應用程序使用Celery Beat,必須配置Celery Beat的調度器。我們可以使用文件(也可以使用數據庫,或任何Celery支持的後端)來配置調度器。在項目的根目錄創建一個名為celery.py的文件,並添加以下內容:
# celery.py
import os
from celery import Celery
from datetime import timedelta
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')
app = Celery('my_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.beat_schedule = {
'task-name': {
'task': 'myapp.tasks.task_name',
'schedule': timedelta(seconds=60),
},
}
app.autodiscover_tasks()
這定義了一個名為task-name的簡單任務,它將在60秒後運行。其中,’myapp.tasks.task_name’是將要運行的任務的路徑。schedule定義執行任務的頻率,timedelta(seconds=60)表示每60秒運行一次。
最後一步是啟動Celery Beat調度器,並將其綁定到Django。
# celery.py
from celery import Celery
from django.conf import settings
from datetime import timedelta
app = Celery('my_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.beat_schedule = {
'task-name': {
'task': 'myapp.tasks.task_name',
'schedule': timedelta(seconds=60),
},
}
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
現在,我們已經讓Celery Beat調度器知道了要執行的任務及其頻率。接下來我們需要為這個任務寫一個處理函數。
三、編寫Celery任務
在我們的應用程序中,創建一個tasks.py文件,並在其中添加以下內容:
# tasks.py
from celery.decorators import task
@task
def task_name():
# do something here
任務的處理函數可以根據具體需要實現。這裡,我們僅僅定義了一個空函數。
四、啟動Celery Worker和Beat
我們已經配置好了Celery Beat任務調度器並編寫了處理任務的處理函數。要啟動這兩個服務,需要在終端中執行以下命令。
$ celery -A my_project worker -l info
$ celery -A my_project beat -l info
現在,Celery Beat將會在每60秒調用我們的任務處理函數。
五、調整Celery Beat的配置和API
在上面的示例中,我們定義了一個簡單的任務調度程序示例。Celery Beat還提供了更多高級功能和選項,可以通過設置Celery配置來更改其設置。
更多信息請查看Django Celery Beat文檔:https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html#django-celery-beat-database-backed-periodic-tasks
原創文章,作者:FQCGW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/329691.html