进程 -> 线程 -> 协程
线程的介绍
重要性
◆ 跳槽、面试、决定薪资高度
◆ 解决”效率”问题
◆ Python的GIL导致的系列问题
◆ 通常会混合使用(多进程 + 协程)
进程
◆ 是一个执行中的程序
◆ 每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据
◆ 操作系统管理其上所有进程的执行,并为这些进程合理地分配时间
◆ 进程也可通过派生(fork或者spawm)新的进程来执行其他任务
PS:fork在windows上的支持不是太好,代码只可能在Linux上运行的话,建议用fork。
线程
◆ 在同一个进程下执行,并共享
相同的上下文
◆ 一个进程中的各个线程与主线程共享同一片数据空间
◆ 线程包括开始、执行顺序和结束三部分
◆ 它可以被抢占(中断)和临时挂起(也称为睡眠)——让步
◆ 一般是以并发方式执行
并发
◆ 不等同于并行处理
◆ 是一种属性——程序、算法或问题的属性
◆ 并行只是并发问题的可能方法之一
◆ 如果两个事件互不影响,则两个事件是并发的
多核的利用及GIL概念
对多核的利用
◆ 单核CPU系统中,不存在真正的并发
◆ GIL —— 全局解释器锁
◆ GIL只是强制在任何时候只有一个线程可以执行Python代码
◆ I/O密集型应用与CPU密集型应用 (架构师和后台开发需要对此有更深的了解)
Python对I/O密集型应用会有比较强大的优势,在CPU密集型应用就发挥不出这样的优势了。而为了弥补CPU密集型应用的缺陷,可以进行C或者C++的扩展。
GIL执行顺序
设置GIL
切换进一个线程去运行
执行下面操作之一:
◆ 指定数量的字节码指令
◆ 线程主动让出控制权(可以调用time.sleep(0)来完成)
把线程设置回睡眠状态(切换出线程)
解锁GIL
重复上述步骤