因为项目需要,经常需要将 celery 引入工程,因为它不想其他包那样安装后就能使用,所以总结了以下步骤,方便快速接入。
以下基于 celery 4.4 和 django 4.1 版本
- 在需要异步任务的工程目录(假设名字叫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
文件需要根据项目的实际情况进行设置 -
celery.py
所在的python包需要加入 Django 的INSTALLED_APPS
, 因为后面要启动单独的进程接收 celery 消息,没有这一步的话会启动失败
- 在相同目录下添加
tasks.py
,用于编写异步任务
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
,主要是设置 broker
# 假设BROKER_URL在环境变量中定义
CELERY_BROKER_URL = os.getenv('BROKER_URL')
如果需要 celery beat 进行定时任务,还需要配置
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
经过以上几个步骤,就可以将 celery 成功接入到工程了。