python知识树
知识记录
PythonGIL、原子操作、线程安全
参考文章:https://www.cnblogs.com/ArsenalfanInECNU/p/9968621.html
GIL
GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。这样做是为了Python解释器中原子操作的线程安全
当执行多线程程序时,由GIL来控制同一时刻只有一个线程能够运行。
GIL的优点:GIL可以保证我们在多线程编程时,无需考虑多线程之间数据完整性和状态同步的问题。
GIL的缺点:我们的多线程程序执行起来是“并发”,而不是“并行”。因此执行效率会很低,会不如单线程的执行效率。
规避GIL带来的影响:
- 用multiprocess(多进程)替代Thread(推荐)
- 使用互斥锁:在开发中我们可以使用互斥锁来保护某个对象,使得在多线程同时访问某个对象的时候,不会将该对象破坏
总结:
- 因为GIL的存在,只有IO Bound场景下得多线程会得到较好的性能
- 如果对并行计算性能较高的程序可以考虑把核心部分也成C模块,或者索性用其他语言实现
- 在Python编程中,如果想利用计算机的多核提高程序执行效率,用多进程代替多线程
- 即使有GIL存在,由于GIL只保护Python解释器的状态,所以对于非原子操作,在Python进行多线程编程时也需要使用互斥锁(如thread中的lock)保证线程安全。
GIL在较长一段时间内将会继续存在,但是会不断对其进行改进
原子操作
原子操作:原子操作就是不会因为进程并发或者线程并发而导致被中断的操作,特点是要么一次全部执行,要么全不执行。
当对全局资源存在写操作时,如果不能保证写入过程的原子性,会出现脏读脏写的情况。
线程安全
进程是系统资源分配的最小单位,线程是程序执行的最小单位
线程安全一般都涉及到synchronized,就是多线程环境中,共享数据同一时间只能有一个线程来操作,不然中间过程可能会产生不可预制的结果。
线程、进程、协程
参考文章:https://www.cnblogs.com/Survivalist/p/11527949.html
线程是执行程序的最小单位
进程是系统资源分配的最小单位
协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行.
- 协程极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
- 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
一个进程可以拥有多个线程,一个线程也可以拥有多个协程