1
利用多线程以装饰器的方式实现异步执行
例:执行此任务
from time import sleep
def i():redis
sleep(3) print('任务1')
def j():算法
print('任务2')
i()
j()
执行结果:
(等待三秒钟后)
任务1
任务2django
把装饰器封装入一个模块加入线程装饰器后
装饰器为(
import threading多线程
def thd(a):并发
def wrapper(*args,**kwargs): thd=threading.Thread(target=a,args=args,kwargs=kwargs) thd.start() return wrapper
)app
from time import sleep
from td import thd异步
@thd
def i():分布式
sleep(3) print('任务1')
def j():工具
print('任务2')
i()
j()
执行结果为:
任务2
(间隔3秒)
任务1优化
浅析:适合较长cpu时间运算的场合,好比图像处理,算法执行。只有少数几个并发操做的时候还无伤大雅,若是须要处理大量的并发操做时就不合适了。由于上下文切换的开销,增长资源消。
2.
celery:
Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,而且提供维护这样一个系统的工具。Celery能够帮助咱们快速在不一样的机器设定不一样任务。专一于实时处理的任务队列,同时也支持任务调度。
例:实现异步发送短信功能
建立celery_tasks用于保存celery异步任务。
celery_tasks目录下建立config.py文件,用于保存celery的配置信息
roker_url = "redis://127.0.0.1/10"
在celery_tasks目录下建立main.py文件,用于做为celery的启动文件
from celery import Celery
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings.dev'
app = Celery('xxx')
app.config_from_object('celery_tasks.config')
app.autodiscover_tasks(['celery_tasks.sms'])
在celery_tasks目录下建立sms目录,用于放置发送短信的异步任务相关代码。
将提供的发送短信的云通信SDK放到celery_tasks/sms/目录下。
在celery_tasks/sms/目录下建立tasks.py文件,用于保存发送短信的异步任务
# 发送短信验证码
sms_code_expires = constants.SMS_CODE_REDIS_EXPIRES // 60 sms_tasks.send_sms_code.delay(mobile, sms_code, sms_code_expires) return Response({"message": "OK"})
浅析:
优势:
简单: celery使用很简单, 你能够不用配置就能够启动一个任务
高度可用: worker和clients会自动处理失败或丢失的消息
快: 一个celery每分钟能够处理数百万的任务(使用RabbitMQ并作好优化)
灵活: 几乎Celery的每一个部分均可以自行扩展或使用, 自定义池实现, 序列化器, 压缩方案, 日志记录, 调度程序, 消费者, 生产者, 代理传输等等
缺点:
celery的任务队列长度,若队列中的任务过多,则可能致使长时间等待,下降效率。
欢迎补充,谢谢观看