python中实现异步任务的方式浅析
1
利用多线程以装饰器的方式实现异步执行
例:执行此任务
from time import sleep
def i():
sleep(3) print('任务1')
def j():
print('任务2')
i()
j()
执行结果:
(等待三秒钟后)
任务1
任务2
把装饰器封装入一个模块加入线程装饰器后
装饰器为(
import threading
def thd(a):
def wrapper(*args,**kwargs): thd=threading.Thread(target=a,args=args,kwargs=kwargs) thd.start() return wrapper
)
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
为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings.dev'
创建celery应用
app = Celery('xxx')
导入celery配置
app.config_from_object('celery_tasks.config')
自动注册celery任务
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的任务队列长度,若队列中的任务过多,则可能导致长时间等待,降低效率。
欢迎补充,谢谢观看