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

发布于 2018-12-07  约 4 分钟

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

欢迎补充,谢谢观看

阅读 1.1k发布于 2018-12-07

推荐阅读
目录