python中实现异步任务的方式浅析

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

为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的任务队列长度,若队列中的任务过多,则可能致使长时间等待,下降效率。

欢迎补充,谢谢观看

相关文章
相关标签/搜索