python的threading模块
一、线程
线程是操作系统能够进行运算调度的最小单位。线程被包含在进程中,是进程中实际处理单位。
一条线程是指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
二、进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
三、区别
进程是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。
进程中所包含的一个或多个执行单元成为线程。进程还拥有一个私有的虚拟地址空间,该进程空间仅能被它所包含的线程访问。
线程只能归属于一个进程并且它只能访问该进程所拥有的资源,一个进程下的所有线程共享该进程的资源。当操作系统创建一个进程后,该进程自动申请一个名为主线程或首要线程的线程。
处理计算密集型任务或函数用进程
处理IO密集型任务或函数用线程
四、GIL
首先,GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。
同一段代码可以在CPython,PyPy,Psyco等不同的Python执行环境中运行,其中PyPy就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境,所以CPython的GIL缺陷也就约等在了Python身上。
GIL特性:
python中的一个线程对应于c语言中的一个线程(CPython)
GIL使得同一时刻只有一个线程在CPU上执行字节代码,无法将多个线程映射到多个CPU上去执行。
GIL会很据执行的字节码行数以及时间片释放GIL,GIL在遇到io操作时会主动释放
也就是说 在同一时刻,只有一个线程进入CPython解释器
解决GIL限制的办法:
1. 多进程编程:既然多线程不能同时进入CPython解释器,我们可以通过把多个线程放入不同进程中,让多进程进入CPython解释器,分配给各个CPU,以利用多核实现并行。
2. 协程:后面会讲到