Python中浅谈的全局锁(GIL)问题

  

<>强中央处理器受限(计算密集型)和I/O (I/O密集型)

  

<强>计算密集型任务(CPU)的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态。比如复杂的加减乘除,计算圆周率,对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

  

计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要.Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

  

<强> IO密集型任务(I/O)的特点是指磁盘IO,网络IO占主要的任务,CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。

  

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。

  

对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如请求网页,读写文件等。当然我们在Python中可以利用睡眠达到IO密集型任务的目的。

  

对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

  

<强>全局锁问题:

  

解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。

  

吉尔最大的问题就是Python的多线程程序并不能利用多核CPU的优势(比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。

  

吉尔只会影响到那些严重依赖CPU的程序(比如计算型的)

  

如果你的程序大部分只会设计到I/O,比如网络交互,那么使用多线程就很合适,因为它们大部分时间都在等待。实际上,你完全可以放心的创建几千个Python线程,现代操作系统运行这么多线程没有任何压力,没啥可担心的。

  

  

首先,如果你完全工作于Python环境中,你可以使用多处理模块来创建一个进程池,并像协同处理器一样的使用它。

        池=没有      #执行大量计算(CPU绑定)   def some_work (args):   …   返回结果      def some_thread ():   而真正的:   …   r=池。应用(some_work (args))   …      # Initiaze池   if __name__==癬_main__”:   进口多处理   池=multiprocessing.Pool ()   之前      

另外一个解决吉尔的策略是使用C扩展编程技术。主要思想是将计算密集型任务转移给C,跟Python独立,在工作的时候在C代码中释放吉尔。

  

以上这篇浅Python中谈的全局锁(GIL)问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

Python中浅谈的全局锁(GIL)问题