由于GIL的存在,无论是python2还是python3都无法很好地利用多线程并发执行。
对于单核CPU而言,多线程就是为了降低阻塞。在某个thread进行IO的时候sleep掉,转而去执行另一个thread,可以更有效地利用CPU。
对于多核CPU而言,多线程的作用是为了利用多核CPU的性能,使之可以协同并进处理数据,但是会遇到核与核之间数据保持一致和执行同步的问题。为此python设计了GIL这么一个东西,它的机制是将一个python进程的执行限定在一个核内(一个时刻必须在一个核,但是可以切换),可以理解为是线程安全的。
我觉得…这TMD是BUG吧,分明是多线程调度算法写挫了之后的替代品,这样搞的话在多核时代python的多线程就是个笑话…
冷静分析,GIL的存在还收有优点的:IO密集的程序中可以提速;提醒使用者,要实现运算密集的程序转而用其他更低级一些的高级语言(比如C/C++)实现。
但是对于普通使用者而言,是没有时间转而用低级语言再设计通信接口的。好在python的multiprocessing库可以辅助解决GIL的存在,但是又面临了新的问题:进程之间数据通信的问题,做法网上有很多了,推荐一个博客:http://blog.csdn.net/shaohui973/article/details/8142797
网友评论