原因1:
原因2:
GIL是什么?全局解释器锁〔英语:Global Interpreter Lock,缩写GIL) 是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。 即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行一个线程。 下图就是一个例子: 三个线程Thread1、2、3,哪个线程持有GIL,该线程才在执行,当遇到I/O时,就会释放GIL,I/O是指读写操作、发送网络等等 Thread1持有GIL,遇到I/O,释放GIL,这时Thread2才能开始进入运行状态 ![]() 由于GIL的存在,即使电脑有多核CPU单个时刻也只能使用1个,相比并发加速的C++/JAVA所以慢。 单个时刻单个进程只能使用1个线程,但多进程下就可以有。 总结:(Python是一门伪多线程语言) 为什么有GIL这个东西GIL存在目的:为了解决多线程之间数据完整性和状态同步问题 GIL存在原因:Python中对象的管理,是使用引用计数器进行的,引用数为0则释放对象(涉及到Python的垃圾回收) 举例:开始:线程A和线程B都引用了对象obj,obj.ref_num 2,线程A和B都想撤销对obj的引用 若其中发生多线程调度切换,进行了两次对象释放,其导致的结果:发生报错,可能错释放别的内存,破坏内存。 ![]() GIL的引入就是解决以上类似的问题:简化了Python对共享资源的管理。 怎样规避GIL带来的限制1、多线程threading用于IO密集型计算,不用于CPU密集型计算 因为在I/O (read,write,send,recv,etc.)期间,线程会释放GIL,实现CPU和IO的并行因此多线程用于IO密集型计算依然可以大幅提升速度 用于CPU密集型计算时,只会更加拖慢速度(只有一个cpu在运行,且多线程切换会增加开销) 2、使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势 为了应对GIL的问题,Python提供了multiprocessing 更多学习 更多关于python自动化、测试开发、高级性能测试、java学习资料可以留言咨询。 |
|