python-django项目中使用celery异步

Celery的介绍

Celery分为3个部分
​ (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代码,当然还包括python调用系统工具功能)
​ (2)broker部分负责任务消息的分发以及任务结果的存储,这部分任务主要由中间数据存储系统完成,比如消息队列服务器RabbitMQ、redis、
Amazon SQS、MongoDB、IronMQ等或者关系型数据库,使用关系型数据库依赖sqlalchemy或者django的ORM
​ (3)Celery主类,进行任务最开始的指派与执行控制,他可以是单独的python脚本,也可以和其他程序结合,应用到django或者flask等web框架里面以及你能想到的任何应用

celery的运用比较简单:

  • 安装celery
  • 创建一个celery application 用来定义你的任务列表
  • 编写需要异步执行的任务函数,并用celery实例的task修饰器修饰
  • 调用异步任务时, 用函数名.delay(参数)形式调用为异步调用。 函数名(参数)方式为同步调用。
  • 执行celery监听服务

celery的具体使用

这里已上一篇的发送短信验证码为例进行代码说明:


image.png
celery_tasks.main.py:Celery实例化文件
from celery import Celery
import os

# 读取django项目的配置,若执行的任务在配置文件中有相关配置,则要加载
# os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings.dev"

# 创建celery对象
app = Celery('celery_test')

# 加载配置
app.config_from_object('celery_tasks.config')

# 注册需执行的任务
app.autodiscover_tasks([
    'celery_tasks.sms',
   ])
celery_tasks.config.py:配置文件
# 指定rabbitmq或则redis作为celery的队列
# broker_url= 'amqp://guest:[email protected]:5672'
broker_url = 'redis://127.0.0.1:6379/14'

定义发送短信的任务:

celery_tasks.sms.tasks.py:定义任务
# bind:保证task对象会作为第一个参数自动传入
# name:异步任务别名
# retry_backoff:异常自动重试的时间间隔 第n次(retry_backoff×2^(n-1))s
# max_retries:异常自动重试次数的上限
@celery_app.task(bind=True, name='ccp_send_sms_code', retry_backoff=3)
def ccp_send_sms_code(self, mobile, sms_code):
    """
    发送短信异步任务
    :param mobile: 手机号
    :param sms_code: 短信验证码
    :return: 成功0 或 失败-1
    """
    try:
        send_ret = CCP().send_template_sms(mobile, [sms_code, 5], 1)
    except Exception as e:
        logger.error(e)
        # 有异常自动重试三次
        raise self.retry(exc=e, max_retries=3)
    if send_ret != 0:
        # 有异常自动重试三次
        raise self.retry(exc=Exception('发送短信失败'), max_retries=3)

    return send_ret

启动Celery服务(在终端)

# 在celery_tasks所在目录终端执行
celery -A celery_tasks.main worker -l info

调用发送短信任务

# 发送短信验证码
# CCP().send_template_sms(mobile,[sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)
# Celery异步发送短信验证码
ccp_send_sms_code.delay(mobile, sms_code)

你可能感兴趣的:(python-django项目中使用celery异步)