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

 更新时间:2019年01月11日 14:54:06   作者:xsj_blog  
今天小编就为大家分享一篇浅谈Python中的全局锁(GIL)问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

CPU-bound(计算密集型) 和I/O bound(I/O密集型)

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

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

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

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

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

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

全局锁问题:

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

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

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

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

解决方案:

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

pool = None

# Performs a large calculation (CPU bound)
def some_work(args):
 ...
 return result

def some_thread():
 while True:
  ...
  r = pool.apply(some_work, (args))
  ...

# Initiaze the pool
if __name__ == '__main__':
 import multiprocessing
 pool = multiprocessing.Pool()

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

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

相关文章

  • 举例讲解Python编程中对线程锁的使用

    举例讲解Python编程中对线程锁的使用

    Python的threading模块中提供了多种锁的相关方法,Python的多线程不能同时执行,因而锁的使用非常关键,下面我们就来举例讲解Python编程中对线程锁的使用:
    2016-07-07
  • python区分不同数据类型的方法

    python区分不同数据类型的方法

    这篇文章主要介绍了python区分不同数据类型的方法实例以及相关知识点,需要的朋友们学习下。
    2019-10-10
  • python中的class_static的@classmethod的巧妙用法

    python中的class_static的@classmethod的巧妙用法

    python中的class_static的@classmethod的使用 classmethod的使用,主要针对的是类而不是对象,在定义类的时候往往会定义一些静态的私有属性,今天通过示例代码看下classmethod的妙用
    2021-06-06
  • 基于PyQt5制作一个数据图表生成器

    基于PyQt5制作一个数据图表生成器

    这篇文章主要介绍了如何利用PyQT5制作一个数据图表生成器,可以通过Pyecharts模块生成可视化的html数据图表,感兴趣的小伙伴可以跟随小编学习一下
    2022-02-02
  • Pycharm-community-2020.2.3 社区版安装教程图文详解

    Pycharm-community-2020.2.3 社区版安装教程图文详解

    这篇文章主要介绍了Pycharm-community-2020.2.3 社区版安装教程图文详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 如何使用pandas对超大csv文件进行快速拆分详解

    如何使用pandas对超大csv文件进行快速拆分详解

    Pandas是Python语言的一个扩展程序库,提供高性能、易于使用的数据结构和数据分析工具,下面这篇文章主要给大家介绍了关于如何使用pandas对超大csv文件进行快速拆分的相关资料,需要的朋友可以参考下
    2022-07-07
  • python文件目录操作之os模块

    python文件目录操作之os模块

    这篇文章主要介绍了python文件目录操作之os模块,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Python Django框架实现应用添加logging日志操作示例

    Python Django框架实现应用添加logging日志操作示例

    这篇文章主要介绍了Python Django框架实现应用添加logging日志操作,结合实例形式分析了Django框架中添加Python内建日志模块相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • django使用JWT保存用户登录信息

    django使用JWT保存用户登录信息

    这篇文章主要介绍了Django使用jwt获取用户信息的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 利用Python编写一个藏头诗在线生成器

    利用Python编写一个藏头诗在线生成器

    这篇文章主要介绍了如何利用Python编写一个藏头诗在线生成器,文中的示例代码讲解详细,感兴趣的同学可以跟随小编一起动手尝试一下
    2022-04-04

最新评论