使用celery实现异步任务

使用celery实现异步任务

了解Celery:

​ celery是一种即插即用的任务队列

​ celery适合异步处理任务,如发送短信、邮件、文件上传、图像处理等比较耗时的操作,可将其异步执行,用户不需要等待太多时间,提高用户体验。

特点:

​ 简单易于使用。

​ 高效,单个celery进程每分钟可以处理数百万个任务

​ 灵活:celery中几乎每个部分都可以自定义扩展

​ celery非常易于集成到一些web开发框架中

####组成结构

  • 任务队列是一种跨线程、跨机器工作的一种机制
  • 任务队列中包含任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理。
  • celery通过消息进行通信,通常使用一个叫broker(中间人)来协助client(任务发出者)和worker(任务处理者)
  • client发出消息到队列中,broker将队列中的消息派发给worker来处理
  • 一个celery系统可以包含很多worker和broker,可增强横向扩展性和高可用性能。

使用流程

  • 导入celery模块 创建celery_tasks/main.py文件

    from celery import Celery
  • 创建celery实例对象,加载配置 ,即创建client客户端

    # 创建celery实例
    app = Celery('脚本名')
    # 加载配置文件 注意从celery文件夹开始
    app.config_from('celery配置文件位置')
    # 设置自动加载任务
    app.autodiscover_tasks(['celery_tasks.任务名'])
  • 创建中间人broker

    中间人broker有下列几种方案进行选择:

    1. RabbitMQ详情参见链接RabbitMQ
    2. Redis
      • Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。详情见链接Redis
  • 创建任务,并让celery检测

    from libs.yuntongxun.sms import CCP
    from celery_tasks.main import app
    
    #可以设置name参数
    @app.task(name='send_sms_code')   # 使用celery实例对象装饰@app.task()
    def send_sms_code(mobile,sms_code):
    
        ccp = CCP()
        ccp.send_template_sms(mobile, [sms_code, 5], 1)
    • celery检测任务

      app.autodiscover_tasks(['celery_tasks.任务名'])

  • 创建worker

from celery import Celery

#进行Celery允许配置
# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'mall.settings'


#创建Celery对象
#参数main 设置脚本名
app = Celery('celery_tasks')

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

#自动加载任务
app.autodiscover_tasks(['celery_tasks.sms'])
  • 最后使用指令执行
celery -A celery对象的路径 worker -l info

后台显示如图
在这里插入图片描述