概念:进程、线程、协程、GIL、同步异步、串行并行、并发
进程(Process)
- 进程是系统进行资源分配和调度的一个独立单位
- 程序是指令、数据及其组织形式的描述,进程是程序的实体。
- 在面向线程设计的计算机结构中,进程是线程的容器。
- 一个进程可以有多个线程
线程(thread)
- 是操作系统能够进行运算调度的最小单位
- 包含在进程之中,是进程中的实际运作单位。
- CPU调度和分派的基本单位
- 一个线程可以有多个协程
协程(coroutine)
- 协程是一轻量级的线程,开销最小
- 是一种程序组件
- 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
GIL(全局解释锁)
-
GIL,the Global Interpreter Lock,直译为“全局解释锁”
-
GIL是Python解释器(Cpython)时引入的概念,GIL并不是Python的语言缺陷。
-
CPython在执行多线程的时候并不是线程安全的,为了线程间数据的一致性和状态同步的完整性。
-
Cpython中的多线程是“伪多线程”,因为GIL在单个CPU中一次只允许执行一个线程
-
特性:
- 弊端:对计算密集型的程序会产生影响(慢)
- 优势:IO密集型
-
如何解决全局解释锁对多线程的限制?
- 重写python编译器(官方cpython)如使用:PyPy解释器
- 调用C语言的链接库
同步
- 按顺序执行。
- 要等待前一个执行完成,才能执行下一个。
异步
- 不按照顺序执行,并行执行。
- 不用等待。
串行
- 一条通道按顺序执行
- “排一条队”
并行
- 多条通道
- 执行任务的数量小于或者等于cpu的数量
并发
- 伪并行,实际上是由CPU高速交替执行的结果
- 任务的数量大于cpu的数量
- 用信号量来控制进程/线程的并发量
个人总结
1. .join()同步(线程/进程);不使用则是异步(线程/进程)。
2. 串行(单进程)、并行(多进程)用在进程中(跟CPU个数有关,即核数).(引出进程锁与信号量控制进程并发数)
3. 因为GIL机制(一次只允许执行一个线程)Python中常常使用“多进程+协程”的方式**