首先要有跑起来的redis在,这个各个教程都有
之后在setting的同文件即名字和project同名的包含wsgi.py的文件夹下创建文件:celery.py
from __future__ import absolute_import, unicode_literals
from celery import Celery
from django.conf import settings
import os
# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', os.environ.get('SETTINGS'))
# 实例化Celery,网上很多教程这里都是没有设置broker造成启动失败
app = Celery('tasks', broker='redis://127.0.0.1:6379/0')
# 使用django的settings文件配置celery
app.config_from_object('django.conf:settings')
# Celery加载所有注册的应用
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
setting里边也需要:
# celery settings
# celery中间人 redis://redis服务所在的ip地址:端口/数据库号
BROKER_URL = 'redis://127.0.0.1:6379/0'
# celery结果返回,可用于跟踪结果
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
# celery内容等消息的格式设置
CELERY_ACCEPT_CONTENT = ['application/json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = TIME_ZONE
注意,打包docker的时候,要在dockerfile里写默认的SETTINGS,通常是为了多环境设置
在需要执行异步的方法上注明这是一个celery的task:
from django.core.mail import send_mail
from django.conf import settings
from celery import task
@task
def send_email(subject, message, receiver_email): # receiver email is a list
send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
receiver_email, fail_silently=False)
在具体调用执行的时候,使用delay方法来实现异步:
send_email.delay(subject, message, [receivers])
通常在本地,在系统跑起来之前,先跑celery:
celery -A <project-name> worker -l info
在服务器上,通常我会跑在docker里,redis跑作守护进程,celery output在后台,所以在dockerfile里要写上:
redis-server --daemonize yes&&
celery multi start w1 -A <project-name> -l info