- GIL global interpreter lock (cpython) 全局解释器
- python 中的一个线程对应于C 语言中的一个线程
- gil 使得同一个时刻只有一个线程在一个CPU 上执行字节码,无法将多个线程映射到多个CPU 上执行
- GIL会根据执行的字节码行数以及时间片释放GIL ,GIL 在遇到IO 操作时主动释放
- 并发并行
- 并发:
- 一个时间段内,有几个程序同时在一个CPU 上运行,但是任意时刻只有一个程序在CPU 上运行
- 并行
- 任意时间点上,有多个程序同运行在多个CPU 上,并行数与CPU 数一致
- 并发:
- 同步异步
- 同步
- 同步是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式
- 异步
- 异步是指代码调用IO 操作时,不必等IO 操作完成就返回的调用 方式
- 同步
- 阻塞、非阻塞
- 阻塞是指调用函数时后当前线程被挂起
- 非阻塞是指调用函数时候在当前线程不会被挂起,而是立即返回
- Unix下五种I/O 模型
- 阻塞式I/O
- 非阻塞式I/O
- I/O 复用
- 信号驱动式I/O
- 异步i/o(POSIX的aio系列函数)
- 阻塞式I/O
- select、pool、epoll
- select、pollepoll 都是IO 多路复用的机制。I/O 多路复用就是通过一种机制,一个进程可以监控多个描述符,一旦某个描述符就绪(一般是都就绪或者写就绪),能够通知程序 进行相应的读写操作,但select,poll,epoll 本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O 则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间
- select
- poll
- epoll
-
#1. epoll 并不一定比select好
#在并发高的情况下,连接活跃度不是很高,epoll 比select 好
#并发不高,同时连接很活跃,select 比epoll 好
- C10M问题
- 如何利用8核CPU 64G 内存,在10gbps 的网络上保持1000万并发连接
-
什么是协程
- 解决问题
- 回调模式编码复杂度高
- 同步编程的并发性不高
- 多线程编程需要线程同步,lock
- 方法
- 采用同步的方式去编写异步的代码
- 采用单线程去切换任务
- 线程是由操作系统切换 的,单线程以为着我们需要程序员自己去调度任务
- 不再需要锁,并发性高,如果单线程内切换函数,性能远高于线程切换,并发性高
asyncio 异步IO - 解决问题
- 包含各种 特定系统实现的模块化事件循环
- 输出和协议抽象
- 对 tcp 、UDP、SSL、子进程,延时调用以及其他的具体支持
- 模仿futures模块但适用于事件循环使用的Future类
- 基于yield from 的协议和任务,可以让你用顺序的方式编写并发代码
- 必须使用一个将产生阻塞IO 的调用时,有接口可以把这个事件转移到线程池
- 模仿threading 模块中的同步原语、可以用在单线程内的协程之间
- q