1. python主流web框架
1.1 同步框架
django, flask, hug
实现原理: wsgi , handler(env, start_response)
部署方式: nginx + web服务器(uwsgi/gunicorn) + web app(django, flask, hug)
1.2 异步框架
tornado, sanic, fastapi
实现原理: event_loop(asyncio/gevent) + 协程
部署方式: nginx + web服务器(tornado, sanic, fastapi)
2. 魔术方法的使用
2.1 __new__, __init__
1 | |
2.2 __call__ : 可调用对象
1 | |
2.3 __slots__ : 限制实例的属性
1 | |
2.4 __enter__ __exit__ :上下文管理
1 | |
2.5 __getitem__, __setitem__
1 | |
#### 3. 装饰器
3.0 装饰器实现原理
函数作为参数: 高级语言可以将函数作为参数使用
闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用
3.1 不带参数的装饰器
1 | |
3.2 带参数的装饰器
1 | |
3.3 类装饰器
1 | |
3.4 装饰类的装饰器
1 | |
3.5 装饰器的执行时间,执行顺序
1 | |
3.6 python内置的常见装饰器
1 | |
4. 列表推导式,字典推导式
1 | |
5. 多继承
1 | |
6. 获取属性和设置属性
1 | |
7. 元编程
7.1 元类
定义: 创建类的类
使用__class__查看对象是由哪个类创建的
1 | |
type: 创建类的类
type创建类的语法
1 | |
7.2 创建一个元类
1 | |
8. 多线程编程
8.1 线程的使用场景
使用场景: io密集型任务
原 因: 由于GIL锁的存在,所以同一时间同一个进程内只有一个线程在cpu上执行,所以严格说python多线程只能实现并发,而不是并行
8.2 线程的使用方法
1 | |
9. 多进程编程
9.1 调用外部程序
1 | |
9.2 开启子进程执行函数
1 | |
9.3 进程池
1 | |
9.4 进程间通讯
1 | |
10. 生成器和协程
10.1 创建生成器
1 | |
10.2 生成器的迭代
1 | |
10.3 生成器的控制—-协程
1 | |
11. 异步编程
11.1 asyncio
11.1.0 asyncio用法
1 | |
11.1.1 用协程实现单进程并发
1 | |
11.1.2 event_loop原理
io多路复用:
windows: select
linux : epoll
11.1.3 asyncio异步调度原理
1 | |
11.2 gevent
11.2.0 gevent实现并发(基于IO切换的协程)
1 | |
11.2.1 原理
event_loop: 基于libev的事件循环
协程 : 当处理一个socket链接时,就创建一个协程greenlet(c拓展库实现)去处理,遇到io操作自动切换
11. 3 asyncio和gevent的区别
gevent:
- python2 需要通过yield + 回调 的方式去实现异步编程,gevent可以使web app以同步的开发方式实现异步编程
- gevent 会在遇到io操作时自动切换,适合无脑开发
asyncio:
- asyncio是在python3.4的时候被加入标准库
- python3.5时支持async await 语法, 让python可以以同步的方式开发异步程序
- asyncio是由用户自己控制阻塞的时机, 所以需要使用异步的io库才能实现真正的异步
- 目前异步io库还不全,成熟的有:aiohttp, aioredis, aiopika等, 没有成熟且好用的orm(mysql)框架