补了GIL(全局解释器)的知识点,自己记录一下加深印象(详情见其他人博客。。)
GIL是保证线程安全的一个底层超级锁,跟Lock不是一个概念。只影响线程,对进程没有影响。
作用是锁定整个解释器内部的全局资源,每个线程要运行都要先获得GIL,这就使得Cpython解释器下 线程是串行的(假的并行)。
而针对IO密集型和计算密集型。GIL的存在使得在处理计算密集型任务时,效率会非常低下,且相当于子在单核下做多线程,根本利用不了多核CPU的优势。原理是 计算密集型任务之间切换的需要时间。A任务拿到GIL进行处理,处理完释放GIL,而B要想拿到GIL得先调度,但调度的时间中 A再次抢到了GIL。差不多是这样子。
而对于IO密集型任务则没有这个情况,IO密集型任务我理解为 --发送—等待回应,而等待回应过程中 释放GIL,切换别的线程发送,就不会出毛病。
所以处理IO密集型用线程,而计算密集型就用进程吧。