python进阶 装饰器Celery等

python 装饰器

装饰器应用

Python装饰器的应用比较广泛,大部分场景的公共处理逻辑都可以使用装饰器去简化。(使用上类似于JAVA中的注解)一般比较常见的场景比如:

  • 日志记录
  • 权限验证
  • 单例模式
  • 竞争资源管理
1.简单装饰器( 是接受了一个函数(对象),并且返回了一个函数(对象)的函数(可调用对象)
2.用于修改对象的装饰器(修改对象的属性)
3.用于模拟对象的装饰器--函数装饰器
4.用于模拟对象的装饰器--类方法装饰器 (唯一的区别就是多了一个默认的self参数;这是因为类方法本身就比函数多这么一个参数)
5.用于模拟对象的装饰器--类装饰器
6.

GIL是CPython中特有的全局解释器锁

这把锁在解释器进程中是全局有效的,它主要锁定Python线程的CPU执行资源。

 在CPython解释器中当一个线程需要执行CPU进行计算之前,它需要先获得这把大锁;否则即使已经被操作系统调度出来,但仍然无法执行计算。所以CPython解释器中,线程的想要执行CPU指令需要2个条件:

1.被操作系统调度出来【操作系统允许它占用CPU】

2.获取到GIL【CPython解释器允许它执行指令】

所有线程都是轮流占用CPU执行指令

如果Python在多核CPU机器上执行的时候,性能则会非常槽糕。主要原因是在单核的时候,同时只有一个线程在执行CPU,所以这个线程总是能获取到GIL。而换到多核的时候,同时会有多个线程在不同的CPU核心上执行,此时不同线程之间就需要竞争GIL,而GIL只能同时被一个线程申请到,所以会导致其它线程处于闲置状态【即使它已经拥有了CPU资源】。所以Python在多核CPU上的多线程始终只有单线程在跑程序。

在早期的Python版本(3.2之前)中,GIL除了会让多线程在多核机器下表现槽糕外,它还会导致某些线程场景占用GIL,而其它线程却无法申请到。典型场景是:

  • 在2个线程的情况下
  • 一个是IO密集型线程
  • 一个是计算密集型线程
那么最后的结果便是,一旦计算密集型线程获得了GIL,那么它在很长一段时间内都将占据GIL,甚至一直到该线程执行结束。因为计算密集型线程在释放GIL之后又会立即去申请GIL,并且通常在其它线程还没有调度完之前它就已经重新获取到了GIL。【因为GIL它没有锁通知机制,比如:Condition锁】
Python多线程的多核的情况下有较大的性能影响,但是为了能在Python中利用多核来提高计算效率,还是有如下的方法可以实现的:
使用python3.4或更高版本(对GIL机制进行了优化)
使用多进程替换多线程(多进程之间没有GIL,但是进程本身的资源消耗较多)
使用C编写高性能模块(with nogil调出GIL限制)
指定cpu运行线程(使用affinity模块)
使用Jython、IronPython等无GIL解释器
全IO密集型任务时使用多线程
使用协程(高效的单线程模式,也称微线程;通常与多进程配合使用)

进程、线程、协程

进程、线程、协程间的特性决定了它们的应用场景不同:

协程常用于IO密集型工作,例如网络资源请求等;而进程、线程常用于计算密集型工作,例如科学计算、人工神经网络等

Celery异步任务队列

Celery 是一个简单,灵活且可靠的分布式系统,可以处理大量消息,同时为操作提供维护该系统所需的工具。

这是一个任务队列,着重于实时处理,同事还支持任务调度。

Celery通过信息进行童心,通常使用经纪人在clients和workers之间进行调解。要启动一个任务,客户端会在队列中当放入一条信息,

然后经纪人将信息传递给工人。

一个Celery系统可以由多个worker和broker组成,从而实现高可用性和横向性质。

celary是用python编写的,但协议可以用任何语言实现。处理python外,还有node.js的Node-celery,PHP客户端,golang的gocelery和Rust的rusty-celery

Celery实现异步任务与定时任务

消息队列与任务队列:是一种实现生产者到消费者童心的童心模型,用于传递消息的,如Kafka,RabbitMQ

任务队列在消息队列之上实现各种任务,比如发邮件

Celery:消息中间件(Broker),任务执行单元(worker),结果存储(Backend)

工作流程:Task client提交任务到Broker,Worker监控Broker取出来的任务并执行,执行结果保存在Backend中。

celery应用开发:celery实例初始化,任务定义,启动worker,调用任务。

Celery多用来执行异步任务,

将耗时的操作交由Celery去异步执行,比如发送邮件、短信、消息推送、音视频处理等。

还可以执行定时任务,定时执行某件事情,比如Redis中的数据每天凌晨两点保存至mysql数据库,实现Redis的持久化。

1、从类型上来说,mysql是关系型数据库,redis是缓存数据库。

2、mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis用于存储使用较为频繁的数据到缓存中,读取速度快。

3、mysql和redis因为需求的不同,一般都是配合使用。

mysql和redis的数据库类型,mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。

@property装饰器 类静态属性装饰器。

Python装饰器的应用比较广泛,大部分场景的公共处理逻辑都可以使用装饰器去简化。(使用上类似于JAVA中的注解)一般比较常见的场景比如:

  • 日志记录
  • 权限验证
  • 单例模式
  • 竞争资源管理

RESTful API

用来开发 RESTful APIs 的库

Django

django-rest-framework:一个强大灵活的工具,用来构建 web API。

django-tastypie:为 Django 应用开发 API。

django-formapi:为 Django 的表单验证,创建 JSON APIs 。

Flask

flask-api:为 flask 开发的,可浏览 Web APIs 。

flask-restful:为 flask 快速创建 REST APIs 。

flask-restless:为 SQLAlchemy 定义的数据库模型创建 RESTful APIs 。

flask-api-utils:为 Flask 处理 API 表示和验证。

eve:REST API 框架,由 Flask, MongoDB 等驱动。

Pyramid

cornice:一个 Pyramid 的 REST 框架 。

与框架无关的

falcon:一个用来建立云 API 和 web app 后端的高性能框架。

sandman:为现存的数据库驱动系统自动创建 REST APIs 。

restless:框架无关的 REST 框架 ,基于从 Tastypie 学到的知识。

ripozo:快速创建 REST/HATEOAS/Hypermedia APIs。

模板引擎

模板生成和词法解析的库和工具。

Jinja2:一个现代的,对设计师友好的模板引擎。

Chameleon:一个 HTML/XML 模板引擎。模仿了 ZPT(Zope Page Templates), 进行了速度上的优化。

Genshi:Python 模板工具,用以生成 web 感知的结果。

Mako:Python 平台的超高速轻量级模板。

队列

处理事件以及任务队列的库。

celery:一个异步任务队列/作业队列,基于分布式消息传递。

huey:小型多线程任务队列。

mrq:Mr. Queue -一个 Python 的分布式 worker 任务队列, 使用 Redis 和 gevent。

rq:简单的 Python 作业队列。

simpleq:一个简单的,可无限扩张的,基于亚马逊 SQS 的队列。

————————————————

版权声明:本文为CSDN博主「唐僧不爱八戒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/python36/article/details/124154266

web应用处理请求的具体流程:

  1. 用户操作操作浏览器发送请求;
  2. 请求转发至对应的web服务器
  3. web服务器将请求转交给web应用程序,web应用程序处理请求
  4. web应用将请求结果返回给web服务器,由web服务器返回用户响应结果
  5. 浏览器收到响应,向用户展示

WSGI是Python应用程序或框架和Web服务器之间的一种接口规范

用以进行并发和并行操作的库。

multiprocessing:(Python 标准库) 基于进程的“线程”接口。

threading:(Python 标准库)更高层的线程接口。

eventlet:支持 WSGI 的异步框架。

gevent:一个基于协程的 Python 网络库,使用 greenlet。

Tomorrow:用于产生异步代码的神奇的装饰器语法实现。

uvloop:在 libuv 之上超快速实现 asyncio 事件循环。————————————————

pandas

hang转列:

1.设置索引、筛选单个字段,得到一个具有二级索引的Series

2.调用Series的unstack方法,得到一个DataFrame

3.rename_axis

4.reset_index

另外还有一个pd.pivot函数,可以让我们直接跳转到上面的第三步

一行变多行

1.如果该列里面的元素不是列表,那么变成列表

2.调用explode方法对该字段进行炸裂

一列变多列

1.如果该列的元素不是字典或列表,那么转成字典或列表

2.调用.applay(pd.Series),如果元素是字典,那么生成的列的名字就是字典的key。元素是列表,生成列默认0,1,2,3,4

如果元素是嵌套了字典的列表,南无一行便多行和一列变多列 可以结合起来使用,先explode。再apply

列转行

通过pd.melt 一步搞定,或者调用DataFrame的stack方法
 

列的对称合并

通过pd.lreshape 一步搞定,或者使用pd.melt 手动是西安

早期使用unstack和stack方法,后面使用pd.pivot 和 pd.melt 函数替代

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值