因為項目需要,經(jīng)常需要將 celery 引入工程,因為它不想其他包那樣安裝后就能使用,所以總結(jié)了以下步驟,方便快速接入。
以下基于 celery 4.4 和 django 4.1 版本
- 在需要異步任務(wù)的工程目錄(假設(shè)名字叫baseline)下添加
celery.py文件如下
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
這一步有幾個注意點
-
settings.py文件需要根據(jù)項目的實際情況進(jìn)行設(shè)置 -
celery.py所在的python包需要加入 Django 的INSTALLED_APPS, 因為后面要啟動單獨的進(jìn)程接收 celery 消息,沒有這一步的話會啟動失敗
- 在相同目錄下添加
tasks.py,用于編寫異步任務(wù)
import time
from baseline.celery import app
from baseline.security_manager import run_model_task
@app.task
def test():
print('this is just a test')
可以看到這里引入的 celery.py 里定義的 app
- 配置
settings.py,主要是設(shè)置 broker
# 假設(shè)BROKER_URL在環(huán)境變量中定義
CELERY_BROKER_URL = os.getenv('BROKER_URL')
如果需要 celery beat 進(jìn)行定時任務(wù),還需要配置
CELERY_BEAT_SCHEDULE = {
'filter-every-5-minutes': {
'task': 'baseline.tasks.test',
'schedule': 5 * 60,
},
}
- 啟動 celery woker
[program:celery_worker]
directory=/app/code
user=root
command = celery -A baseline worker -l info -c 2 -Q celery
stdout_logfile = /app/log/celery_worker.log
redirect_stderr = true
autorestart = true
[program:celery_beat]
directory=/app/code
user=root
command = celery -A baseline beat -l info
stdout_logfile = /app/log/celery_beat.log
redirect_stderr = true
autorestart = true
經(jīng)過以上幾個步驟,就可以將 celery 成功接入到工程了。