Python中GIL全局解释锁的实现
作者:小Pawn爷 发布时间:2023-04-27 16:29:14
标签:Python,GIL,全局解释锁
GIL(Global Interpreter Lock,即全局解释器锁)
1.为什么有GIL
设计者为了规避类似于内存管理这样的复杂的竞争风险问题(race condition)
因为 CPython 大量使用 C 语言库,但大部分C语言库都不是原生线程安全的(线程安全会降低性能和增加复杂度)
2.GIL 是如何工作的
多个线程执行时,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行,同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源
CPython 中还有另一个机制,叫做 check_interval, CPython 解释器会去轮询检查线程 GIL 的锁住情况.每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会
for (;;) {
if (--ticker < 0) {
ticker = check_interval;
/* Give another thread a chance */
PyThread_release_lock(interpreter_lock);
/* Other threads may run now */
PyThread_acquire_lock(interpreter_lock, 1);
}
bytecode = *next_instr++;
switch (bytecode) {
/* execute the next instruction ... */
}
}
3.python的线程安全
有了GIL,任然在编程时需要考虑线程安全
4.如何如何绕过 GIL?
绕过 CPython,使用 JPython(Java 实现的Python解释器)等别的实现
把关键性能代码,放到别的语言(一般是 C++)中实现
5.在处理cpu密集型任务时,为什么有时候使用多线程会比单线程还要慢些?
GIL采用轮流运行线程的机制,GIL需要在线程之间不断轮流进行切换,线程如果多或者运行时间较长,切换带来的性能损失可能超过单线程
6 .你觉得 GIL 是一个好的设计吗?
事实上,在 Python 3 之后,确实有很多关于 GIL 改进甚至是取消的讨论,你的看法是什么呢?你在平常工作中有被 GIL 困扰过的场景吗?
GIL任然是一个好的设计虽然损失了性能,但在保证资源不会冲突和预防死锁方面有一定作用
来源:https://blog.csdn.net/weixin_44689630/article/details/129776268
0
投稿
猜你喜欢
- 描述int函数可以将一个指定进制的数字型字符串或者十进制数字转化为整形。语法int(object, base)名称说明备注object一个数
- 本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下:def matrixMultiply(A, B):
- 本文实例讲述了python生成器用法。分享给大家供大家参考,具体如下:1. 生成器利用迭代器,我们可以在每次迭代获取数据(通过next()方
- max找出tensor 的行或者列最大的值:找出每行的最大值:import torchoutputs=torch.FloatTensor([
- 暴力的重启服务方案一般服务器重启可以直接通过 kill 命令杀死进程,然后重新启动一个新的进程即可。但这种方法比较粗暴,有可能导致某些正在处
- 1.建表脚本1.1.建表DROP TABLE IF EXISTS `sys_region`;CREATE TABLE `sys_region
- 前言在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的。因此,为了使统计得到的结果更方便查看需要进行排序。Py
- 目的: 找出路径坐在的所有python文件(.py结尾),返回列表。代码:def list_py(path = None): if path
- 本文实例为大家分享了python机器人行走步数问题,供大家参考,具体内容如下#! /usr/bin/env python3 # -*- co
- 首先这里声明一下,关于我测试浏览器的版本是chrome15.0.874.121 Firefox 8.01 IE9 IETester下面的代码
- dispy,是用asyncoro实现的分布式并行计算框架。框架也是非常精简,只有4个组件,在其源码文件夹下可以找到:dispy.py (cl
- 集群是一种技术解决方案,它将硬件和软件结合起来,为Web、Email以及数据库等服务提供高可用性和高伸缩性的架构。本文将分析集群的类型,然后
- 准备工作下载python,本文以python3.6为例。python3.6下载地址:python3下载地址,选择合适的版本安装。安装成功后,
- 本文研究的主要是numpy使用技巧之数组过滤的相关内容,具体如下。当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中
- 这篇文章主要介绍了python中的引用和拷贝实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。在程序设计中,鸭子类型(英语:duck typing)
- 我就废话不多说了,直接 上代码吧!import kafka.api.PartitionOffsetRequestInfo;import ka
- 废话不多说了,直接上代码吧!#!/usr/bin/env python# coding=utf-8# 画一棵樱花import turtlei
- 本文实例讲述了Python深拷贝与浅拷贝用法。分享给大家供大家参考,具体如下:1、对象的赋值对象的赋值实际上是对象之间的引用:当创建一个对象
- 具体代码如下所示:import sysimport osclass Logger(object): def __init__(s