博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 之 GIL
阅读量:6545 次
发布时间:2019-06-24

本文共 720 字,大约阅读时间需要 2 分钟。

一,

1.什么是GIL(这是Cpython解释器)

     GIL本质就是一把互斥锁,那既然是互斥锁,原理都一样,都是让多个并发线程同一时间只有一个执行。

     即:有了GIL的存在,同一进程内的多个线程同一时刻只能有一个再运行,意味着在Cpython中,

     一个进程下的多个线程无法实现并行-----》意味着无法使用多核优势(比如四个线程同一时刻只能用一个cpu,如果有4       个cpu的话)

      但并不影响并发的实现。

      GIL可以被比喻成执行权限,同一进程下的所有线程,要想执行都需要先抢执行权限。

2.为何要有GIL?

    因为Cpython 解释器自带垃圾回收机制不是线程安全的。

   为什么不是线程安全的?

   如果线程并行时候,在开辟内存空间时,尚未来得及把值绑定给变量名时候,可能刚好自带的垃圾回收机制运行,被        回  收了,那么值就找不到引用的变量名了。就会不安全。

3.如何用?

  GIL vs 自定义互斥锁

       GIL相当于执行权限,会在任务无法执行的情况下,被强行释放。

        自定义互斥锁即便是无法执行,也不会自动释放。

 

4.有两种并发解决方案:

     多进程:用于 计算密集型

    多线程:用于IO密集型

 

同一进程下的多个线程,先抢GIL锁,才运行python代码,再抢里面的mutex.acquire()锁,此时没有竞争者,只有自己拿这个锁,当遇到IO时,操作系统强行把GIL释放掉,但mutex.acquire()没有释放,另一个线程要等。这时需要导尿等还出cpu,让另一个人抢GIL,当自己睡醒后,再接着之前的状态进行运行,运行完再释放mutex.release

 

转载于:https://www.cnblogs.com/fxc-520520/p/9322482.html

你可能感兴趣的文章
一条复杂SQL实现思路
查看>>
我的友情链接
查看>>
android app 退出时提示确认
查看>>
win10 配置
查看>>
java 编译100个范例
查看>>
Session Cookie ServletContext
查看>>
单点登录SSO
查看>>
遇见有的软件开启后画面模糊怎么解决
查看>>
用selenium实现百度贴吧自动发帖
查看>>
好系统重装助手教你怎么识别固态硬盘还是机械硬盘
查看>>
170. js中获取随机数 (记录一下)
查看>>
深入浅出爬虫之道: Python、Golang与GraphQuery的对比
查看>>
DHCP配置
查看>>
MySQL性能测试(二)——Ubuntu 14.4.02, MySQL 5.6.25, sysbench 4.8
查看>>
nginx 504 Gateway Time-out 的解决 java 工程
查看>>
我的友情链接
查看>>
《在你身边,为你设计》之一:特殊人群的设计关怀
查看>>
Inotify
查看>>
PO BO VO DTO POJO DAO 概念及其作用(附转换图)
查看>>
java实现KMP算法(参考[数据结构(C语言版)].严蔚敏)
查看>>