介绍
GIL (Global Interperter Lock) 称作全局解释器锁,也可以称它为全局排他锁。GIL只在CPython中存在。比如JPython就没有这个概念。
GIL对程序的影响
在python多线程的情况下,每个线程的执行方式是这样的
获取GIL -> 执行代码,直到遇到IO操作,执行了一定的代码量(python2),执行了一定的时间(python3) -> 释放GIL
那么问题来了,GIL是全局锁,也就是一个进程中只有一个,没有拿到GIL就不允许在CPU中执行,所以Python多线程在并不能充分利用多核CPU。
CPU密集型
CPU密集型任务的主要特点就是需要进行大量的计算,消耗CPU资源。CPU密集型程序虽然可以采用多任务来完成,但任务数越多花在任务切换的时间也就越多,所以要高效的利用CPU,CPU密集型任务的数量在理想的情况下应该等于CPU核心数+1。
多任务可以使用多进程和多线程来实现,在多进程情况下,进程数应该等于CPU核心数+1,多线程情况下,线程数也应该等于CPU核心数+1。Python在多进程下没有什么问题,但是在多线程下问题就出来了。
由于Python的GIL的存在,一个进程中只能有一个线程在执行,无法充分利用多核CPU。所以Python的多线程在处理CPU密集型任务时并不是很友好,解决的办法就是使用多进程+协程的方式。
IO密集型
IO密集型任务的主要特点就是大量涉及到网络、磁盘IO的任务。这类任务对CPU的消耗很低,任务的大部分时间都在等待IO操作完成,对于IO密集型任务,任务数越多,CPU的效率就越高,但是也有一个限度。比较理想的任务数是CPU核心数/(1-阻塞系数),阻塞系数一般在0.8-0.9,所以任务数应为核心数的5倍或10倍。
Python的线程会在遇到IO操作时释放GIL,执行别的线程, 所以Python多线程对IO密集型任务比较友好。

本文介绍了Python的全局解释器锁(GIL),指出其在CPU密集型任务中限制了多线程的并行执行,但在IO密集型任务中表现较好。GIL在遇到IO操作或达到一定执行时间后会释放,但不保证线程安全,可能引发并发问题。文章探讨了GIL对线程安全的影响,并举例说明了线程不安全的情况。

1万+

被折叠的 条评论
为什么被折叠?



