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

欢迎补充,谢谢观看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值