多线程同步的概念
多线程同步的“同步”,指的是同步被访问的数据对象的状态(当前数据值),防止发生,例如由于多线程同时写入,而造成的数据状态冲突。
对GIL的分析
GIL的工作原理和特点分析
多核多线程模式会由于GIL被不同的核争用,其他没有GIL的核会pending,而导致多核性能会被降低为单核。
对python来说一个项目的执行,基于cpython解释器只有一个GIL,会导致出现GIL的争用。如果GPU是单核的还好,某个线程运行的时候占用GIL,用完就扔给别的线程使用,一般不会发生冲突。但是如果GPU是多核的,每个核都会运行若干线程,而这若干个核的若干线程只有一个GIL可用,会导致某个核抢到了这个GIL,并投入使用,同时其他的核会有线程被唤醒,那些没争到GIL的线程只能干等着那个占有的GIL的核的线程用完,才有可能使用到GIL进行正常的运行,如果优先级低的话,基本上很难争到GIL,导致该线程一直pending,导致其他核的线程等分配到的时钟到期了,就直接被pending了,然后再排队等待被唤醒,会进入死循环。多核中io密集型线程多还好,因为有io操作,就会有GIL的占用和释放,效率还是可以的。但是多核中只要出现一个计算密集型线程,GIL就会严重限制效率!
针对GIL缺点的解决方案
- 不用cpython:拒绝cpython这个解释器,换别的python解释器,但是cpython是使用最普遍的,使用别的小众的解释器,会有诸多不便,所以弃用cpython值得考虑。
- 不用多线程:GIL在多线程的问题就是,不同线程需要争用GIL,那就不用多线程,而只用多进程,每个进程都可以独立运行,就可以独立占用GIL,用完即弃,对其他的进程不影响,但是可能会失去多线程的优势,需要考虑。
GIL存在的意义
- 对IO密集型线程很友好,尽可能降低了独占GIL的影响。
notes
CPU计算能力过剩时,可以使用多线程,反之一定要用多进程,提高效率。