Python的线程机制理解
1.理解GIL在Python中的含义
Python中的线程从一开始就是操作系统的原生线程,Python线程的第一个概念-----全局解释器锁(GIL)
多线程机制中基本要求则是对共享资源的互斥访问,GIL的互斥 就是解释器的互斥访问,可以理解为Python的虚拟机。当一个线程获得了解释器访问权利之后其他所有线程必须等待当前线程结束后释放才能访问。
在GIL中不仅仅是Python的解释器互斥,还包括了C API 的互斥,在python的扩展编程中会使用到
2.线程调度
理解了GIL是对解释器的互斥之后,接下来就是python的线程调度。比如在多个py文件,或者py线程等待GIL解释器处理,如果说A完全处理结束之后再轮到B,那么就是一个完完全全的单线程处理机制了。所以在多个线程A<B<C这样的线程访问解释器时。我们需要一套线程调度,决定什么时候A被挂起,B执行。
线程调度的两个问题:a.什么时候挂起当前线程进行调度。b.在众多线程中应该选择哪个线程进行处理呢。
在python中,什么时候挂起当前线程有自己处理。模仿操作系统中的时钟中断,在内部维护了一个数值N,如果一个线程的指令执行到了N条就会被挂起,来开始进行线程调度。而接下来调度的结果会选择什么线程执行呢。python则是不干预,完全交于操作系统本身的调度去决定,所以不同的操作系统则会有不同的选择结果。
在交互模式下,import sys sys.getcheckinterval() 可以获得前面说到的维护数值N的大小。
3.thread模块与threading模块
thread模块是Python对底层实现的线程接口C语言的一种封装,而threading则是更高级的线程函数。
以下是线程threading模块的使用总结:
1)threading包含的对象及说明:
threading 模块对象 描述
Thread 表示一个线程的执行的对象
Lock 锁原语对象(跟thread 模块里的锁对象相同)
RLock 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)。
Condition 条件变量对象能让一个线程停下来,等待其它线程满足了某个“条件”。
如,状态的改变或值的改变。
Event 通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,
所有的线程都会被激活。
Semaphore 为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore 与Semaphore 类似,只是它不允许超过初始值
Timer 与Thread 相似,只是,它要等待一段时间后才开始运行