使用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有下列几种方案进行选择:
-
创建任务,并让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
后台显示如图