线程、进程和协程
进程
进程是操作系统进行资源分配和调度的一个独立单位,是应用程序的载体。进程一般有程序,数据集合和进程控制块三部分组成。每一个进程都有自己的独立内存空间,不同进程通过进程间通信。由于进程比较重量,占据独立的内存,所以上下文进程间切换开销比较大,但相对比较安全。
进程具有的特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命周期的,是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是系统进行资源分配和调度的一个独立单位
- 结构性:程序,数据集合和进程控制块三部分组成
进程的生命周期:
进程在运行过程中有三种状态:就绪、运行、阻塞。创建和退出状态是进程的创建过程和推出过程
创建:进程正在创建,还不能运行。操作系统在创建进程时要进行的工作包括分配和建立进程,控制块表象,建立资源表格并分配资源、加载程序并建立地址空间
就绪:时间片已用完,此线程被强制暂停,等待下一个属于它的时间片到来
运行:此线程正在执行,正在占用时间片
阻塞:等待状态,等待某一个事件(如IO或另一个线程)执行完
退出:进程已结束,释放操作系统分配的资源
线程
线程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位,是处理器调度的基本单元。线程一般有线程ID,当前指令指针,寄存器和堆栈组成。一个进程至少拥有一个线程,同一个进程中的多个线程共享该进行的资源。
线程的生命周期:
创建:一个新的线程被创建,等待该线程被调用执行
就绪:时间片已经用完,此线程被强制暂停,等待下一个属于它的时间片到来
运行:此线程正在执行,正在占用时间片
阻塞:等待状态,等待某一个事件(如IO或另一个线程)执行完
退出:一个线程完成任务或者其他终止条件发生,该线程终止进入退出状态,退出状态释放该线程所分配的资源。
协程
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。
进程和线程、协程在python中的使用
- 多进程一般使用multiprocessing库,来利用多核CPU,主要是用于CPU密集型的程序
- 多线程一般使用threading库,主要用户一些IO密集型并发操作
- 协程一般使用gevent库,主要用于非阻塞一步并发的程序
GIL锁
GIL是CPython解释器的概念,叫全局解释器锁。
产生的原因:创建Python是只考虑到单核CPU,解决多线程之间数据完整性和状态同步的最简单的方法就是加锁,于是有了GIL,因为CPython解析只允许拥有GIL全局解析器才能运行程序,这样保证了同一时刻只允许一个线程使用CPU
解决办法:
- 更换Cpython为Ipython
- 使用多进程完成多线程任务
- 在使用多线程的情况可以使用C语言完成