本帖最后由 A180700706 于 2019-1-6 20:36 编辑
[size=14.6667px][ID/昵称]:名字就这样吧 [size=14.6667px][你的性别]:萌妹子一枚 [size=14.6667px][来自哪里]:广西程序媛 [size=14.6667px][兴趣爱好]:听歌,计算机技术,花钱/赚钱,打羽毛球,运动健身,看看书 [size=14.6667px][来的目的]:该奋斗的年纪,切勿选择安逸。 [size=14.6667px][一句心情]:good good study day day up [size=14.6667px]
调用云通讯的过程解析: 异步发送短信:点击获取短信之后,长时间没有反应 解决方法1:用多进程解决:
上图进程的解决办法解析: 发送短息的代码抽取成一个函数,实质发送短信是第三方帮你直接发到客户手机上的,后端只需要返回响应即可
更好的解决方案: Celery异步任务队列 4. Celery异步任务队列,python内置的模块 本质:通过创建进程调用函数来实现任务的异步执行。 概念: 任务发出者:发出任务(要执行函数)消息 任务执行者:提前创建的进程 中间人(任务队列):存放发出任务消息 特点1:解决因开辟很多进程会增大服务器的压力问题,可以在另外的电脑对进程创建 任务消息包含所要执行的任务函数的名称和所需要的参数 任务执行者就是你提前创建好的进程 队列:先进先出
详细图解:
使用步骤: 1)安装:pip install celery 2)创建一个Celery类的实例对象并进行相应(中间人:redis地址)设置 1 2 3 4 5 6 7 8 9 10 11 | # main.py from celery import Celery
# 创建Celery类对象 celery_app = Celery('demo')
# 加载配置信息 celery_app.config_from_object('配置文件包路径')
# celery worker启动时自动发现任务函数 celery_app.auto_discover_tasks([...]) |
补充:
1 2 3 4 | # config.py # 设置中间人地址 # broker_url = 'redis://<ip>:<port>/<db>' broker_url = 'redis://172.16.179.139:6379/3' |
3)封装任务函数,name的名字一般与函数名同名 1 2 3 | @celery_app.task(name='send_sms_code') def send_sms_code(a, b): # 任务函数的代码... |
4)启动worker(创建工作进程) -l后跟 显示日志的级别(info/debug等) celery -A 'celery_app对象所在文件包路径' worker -l info
例子: l代表日记级别:-l info
5)发出任务消息 send_sms_code.delay(1,3)
实例:单独使用: 1.创建celery_tasks文件夹
2.文件夹里创建main.py文件: [Python] 纯文本查看 复制代码 from celery import Celery
# 创建Celery类实例对象
celery_app = Celery('celery_tasks')
# 加载配置
celery_app.config_from_object('celery_tasks.config')
# celery worker启动时自动发现任务函数
celery_app.autodiscover_tasks(['celery_tasks.sms'])
3.config.py # 设置中间人地址 ,选中redis的3空间 broker_url ='redis://172.16.179.139:6379/3'
4.创建sms文件夹,内创建tasks.py文件 [Python] 纯文本查看 复制代码 # 封装发送短信的任务函数
from celery_tasks.main import celery_app
from celery_tasks.sms.yuntongxun.sms import CCP
# 发送短信模板id
SEND_SMS_TEMP_ID = 1
# 获取日志器
import logging
logger = logging.getLogger('django')
@celery_app.task(name='send_sms_code')
def send_sms_code(mobile, sms_code, expires):
print('短信发送任务函数被调用...')
try:
res = CCP().send_template_sms(mobile, [sms_code, expires], SEND_SMS_TEMP_ID)
except Exception as e:
logger.error('发送短信异常: mobile: %s sms_code: %s' % (mobile, sms_code))
else:
if res != 0:
# 发送短信失败
logger.error('发送短信失败: mobile: %s sms_code: %s' % (mobile, sms_code))
else:
# 发送短信成功
logger.info('发送短信成功: mobile: %s sms_code: %s' % (mobile, sms_code))
实例演练: 命令在能看到celery_tasks文件夹的位置进行:
在不同的电脑的执行: 另一台电脑copy一份一模一样的完整的项目代码 如:电脑1:ubuntu---》终端启动worker(创建工作进程) 即可,worker会发现任务并调用对应的任务函数。 电脑2:Mac---》任务函数.delay(1,2) 传进参数1,2分别对应a,b
配置都设置好后,后面就不需要在动了,主要变动的是任务函数的额封装
|