使用celery+redis实现django的异步任务

首先要有跑起来的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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值