• python全局解释锁GIL设计思路分析


    1、GIL的作用:保证任意时刻仅有一个线程在执行,防止多线程并发执行导致的数据异常。

    2、操作系统的pthread_mutex_t也能达到线程互斥的作用,为什么不用?

    注:Linux 环境中,实现线程同步的常用方法有 4 种,分别称为 互斥锁 、 信号量 、 条件变量 和 读写锁 。 互斥锁 (Mutex)又称 互斥量 或者 互斥体 ,是最简单也最有效地一种线程同步机制。

    原因:不是不可以,但更麻烦一些。与GIL对比如下:

    GIL是Python虚拟机执行时,在各个Python字节码执行期间进行切换的。换言之,GIL可以保证字节码级别的线程安全性,不必考虑一条字节码执行了一半线程就被切换的情况,对开发人员更为友好。

    而mutex是操作系统提供的机制,只能保证机器指令(汇编级别)的线程安全性,通常一条Python字节码的实现要使用非常多条的机器指令,如果没有GIL,那CPython开发者需要频繁的通过请求和释放mutex来保证线程安全,开发量增加不说,频繁使用mutex相比于简单粗暴的GIL也不会带来执行效率的提升。

    另外,相比于操作系统原生的mutex,GIL更方便CPython开发者对Python线程进行精确控制,实现特定的功能。比如,每执行100条字节码,就切换一次线程;每5毫秒切换一次线程;线程切换时避免刚切换出去的线程再次切换回来造成的不公平现象等等。

    3、Python运行期间处于等待GIL的线程,会被操作系统调度起来运行吗?从操作系统角度看这个线程是处于什么状态?

    不会。从Python解释器角度来看,这些线程阻塞于GIL的获取操作上。从操作系统角度来看,这些线程阻塞于mutex获取上。

    4、GIL如何实现的?一个线程如何释放GIL,如何获取GIL?

    首先,GIL是一个全局变量,主要有三部分内容:是否锁定,是否有线程请求获取GIL,读写GIL的mutex

    GIL的获取:先获取mutex,然后将GIL的请求标记设置为True,等待其它线程释放GIL

    GIL的释放:每隔一定的时间或执行了一定数量的字节码或遇到系统IO中断,就坚持GIL的请求标记,有其它线程请求GIL则自己就释放掉,然后自己再次请求,等待其它线程释放。

  • 相关阅读:
    Oracle异常处理—ORA-12514:监听程序当前无法识别连接描述符中请求的服务
    plsql永久注册码
    spring boot 大文件上传实现方式(二)
    spring boot 大文件上传实现方式(一)
    正则表达式的应用
    正则表达式汇总
    爬虫数据提取——正则表达式
    爬虫基础URL
    Linux环境搭建-在虚拟机中安装Centos7.0(超详细版)
    在虚拟机中安装Centos7.0
  • 原文地址:https://www.cnblogs.com/tuzkee/p/16019727.html
Copyright © 2020-2023  润新知