什么是消费者与生产者模式?
答:
生产者生产一个东西放入到队列,消费者就取出来消费使用,生产者与消费者使用队列交互。
图解:
为什么要使用celery异步操作?
答:
因为发送短信验证码要去请求第三方平台,是一个耗时操作,如果一个用户请求短信验证码时别的用户就必须等待请求完才能发送下一个请求,所以要使用异步,耗时操作的时候无需等待,直接发送下一个请求
celery在Django上使用的官方文档
安装celery第三方库
-U是下载最新版本
pip install -U Celery
项目根目录创建一个包存放celery的代码
创建main.py入口函数和config.py配置文件
添加任务包
tasks.py代码
- 任务包内就是要异步执行的代码,就是发送短信
- 使用入口函数内的
app对象.task(name="")
装饰
from celery_tasks.main import app
from utils.sms.sms_util import SmsUtil
@app.task(name="celery_send_sms_code")
def celery_send_sms_code(tid, mobile, code):
SmsUtil().send_message(tid, mobile, (code, '3'))
main.py内代码
- 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
- 创建celery对象
app = Celery('celery包名')
- 设置broker
app.config_from_object("celery包名.配置文件名")
- celery自动检测任务
- 设置完之后celery会自动去celery包内的任务包里面去检测任务
app.autodiscover_tasks(['celery包名.任务包'])
import os
from celery.app import Celery
# 设置Django环境,告诉celery当前是Django项目
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo_market.settings')
# 2 创建celery对象
app = Celery('celery_tasks')
# 3 设置 broker
app.config_from_object("celery_tasks.config")
# 4celery自动检测任务 这里会自动去celery_tasks.sms下找tasks.py
app.autodiscover_tasks(['celery_tasks.sms'])
config.py内配置redis
把redis作为队列
broker_url = 'redis://127.0.0.1/15'
视图内调用任务函数
delay延时 使用app.task装饰的函数的delay方法才能实现异步
celery_send_sms_code.delay('1', mobile, sms_code)
命令启动celery
终端进入到文件夹内
celery -A celery_tasks.main worker -l info
celery对windows的支持不是那么好,接收到任务就是不处理的解决办法
冲破BUG!!!!!!!!!
方法一
包名.入口函数 添加--pool=solo 参数 运行celery
celery -A celery_tasks.main worker --pool=solo -l info
方法二
安装gevent包
pip install gevent
添加gevent参数运行celery
celery -A celery_tasks.main worker -l info -P gevent
方法三
安装eventlet包
pip install eventlet
运行celery在后面多加上一个参数 -P eventlet
celery -A celery_tasks.main worker -l info -P eventlet