Python--GIL(全局解释器锁)

在这里插入图片描述

在Python中,GIL(全局解释器锁)是一个非常重要的概念,它对Python的多线程编程有着深远的影响。GIL是Python解释器级别的锁,用于保证任何时刻只有一个线程在执行Python字节码。这意味着即使在多核处理器上,Python的多线程也无法实现真正的并行执行。
简单来说,Python 全局解释器锁(Global Interpreter Lock, 简称 GIL) 是一个互斥锁(或锁),只允许一个线程保持 Python 解释器的控制权。

GIL的起源和目的

GIL的存在主要是因为CPython(Python的官方实现)的内存管理并不是线程安全的。在早期,为了避免对内存管理进行复杂的线程安全操作,Python开发者引入了GIL这一简单的机制。

GIL的影响

  • CPU密集型任务: 对于CPU密集型任务,GIL限制了Python程序在多核处理器上的并行性能。即使使用多线程,程序的执行效率也不会提高,因为在任意时刻只有一个线程在运行。
  • I/O密集型任务: 对于I/O密集型任务,GIL的影响相对较小。这是因为当一个线程等待I/O操作时(如读写文件、网络通信等),它会释放GIL,使得其他线程可以继续执行。

绕过GIL的方法

  • 使用多进程: 通过使用Python的multiprocessing模块创建多个进程,可以绕过GIL的限制,因为每个进程有自己的Python解释器和内存空间。
  • 使用Jython或IronPython: 这些Python实现没有GIL。Jython运行在Java平台上,而IronPython运行在.NET平台上。
  • 使用C扩展: 编写C语言扩展,可以在C层面管理线程,从而规遍GIL。

Python未来和GIL

Python社区一直在探索移除GIL的可能性。某些实验性的或非官方的Python实现(如PyPy)已经尝试了不同的方法来减少GIL的影响或完全移除GIL。

总之,GIL是Python多线程编程的一个关键限制因素,它在保证解释器简单性和线程安全性方面起到了重要作用,但同时也限制了多线程的并行能力。理解GIL及其对程序性能的影响,对于编写高效的Python程序是非常重要的。虽然完全移除GIL可能在未来的Python版本中实现,但目前来看,使用多进程、不同的Python实现或C扩展仍是绕过GIL限制、实现并行计算的有效方法。

如何摆脱 Python 的全局锁的限制

如果 GIL 给您带来了问题,您可以尝试以下几种方法来避开全局锁的限制:
使用多进程编程
最流行的方法是使用多进程方法,其中使用多个进程而不是线程。每个 Python 进程都有自己的 Python 解释器和内存空间,因此 GIL 不会成为问题。Python 有一个多进程multiprocessing 模块,它让我们可以轻松地创建这样的进程:

from multiprocessing import Pool
import time

COUNT = 50000000
def countdown(n):
    while n>0:
        n -= 1

if __name__ == '__main__':
    pool = Pool(processes=2)
    start = time.time()
    r1 = pool.apply_async(countdown, [COUNT//2])
    r2 = pool.apply_async(countdown, [COUNT//2])
    pool.close()
    pool.join()
    end = time.time()
    print('Time taken in seconds -', end - start)

使用 cython 来避开全局锁
cython通常用于处理计算密集型的任务,以加快python程序总体运行速度。
使用替代Python解释器,Python有多个解释器实现。
CPython,Jython,IronPython和PyPy,分别用C,Java,C#和Python编写,是最受欢迎的。GIL 只存在于 CPython 的原始 Python 实现中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/327372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java Web 状态管理(上) Cookie基础

Java Web 状态管理(上) Cookie基础知识 前言一、Cookie产生的背景(不重要)二、Cookie简介三、Cookie的使用场景引入添加苹果进入购物车添加香蕉进入购物车那么假设说没有Cookie正常有Cookie的情况 四、场景简单模拟创建第一个Serv…

蓝桥杯备赛day02 -- 算法训练题 拿金币Java

目录 题目: 问题描述 输入格式 输出格式 解题过程 第一步 定义dp数组 第二步 确定 dp 数组递推公式 第三步 dp数组的初始化 第四步 dp数组的遍历顺序 第五步 举例说明 报错:内存超限 用dp数组去存储位置上的金币 dp数组从二维降为一维 收获&a…

Spark详解

Spark 概念 Spark 提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。 核心架构 Spark Core 包含 Spark 的基本功能;尤其是…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

A ConvNet for the 2020s

21世纪20年代的卷积神经网络 论文链接:https://arxiv.org/abs/2201.03545 项目链接:https://github.com/facebookresearch/ConvNeXt Abstract 视觉识别的“咆哮的20年代”始于视觉Transformer(ViT)的引入,它很快取代了卷积神经网络&#x…

Modbus协议

一.起源 Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种。其中Modbus TCP是在施耐德收购Mo…

数据结构之树和二叉树

树和二叉树的定义和存储 二叉树的遍历 先序遍历 中序遍历 后序遍历 层次遍历 哈夫曼树

Packet Tracer - Layer 2 VLAN Security

Packet Tracer - 第二层VLAN安全配置任务 目标 在SW-1和SW-2之间建立新的冗余链路。在新连接的SW-1和SW-2之间的干线链路上启用中继并配置安全措施。创建一个新的管理VLAN(VLAN 20)并将一台管理PC连接到该VLAN。实施ACL以防止外部用户访问管理VLAN。 背…

Linux命令之服务器的网络配置hostname,sysctl,ifconfig,service,ifdown,ifup,route,ping的使用

1、查看当前主机名称,编辑配置文件修改主机名为你姓名拼音的首字母(如张三,则为zs) 2、查看本机网卡IP地址,编辑/etc/sysconfig/network-scripts/ifcfg-ens33,要求在一块物理网卡上绑定2个IP地址&#xff0…

测试阶段风险不容忽视!QA角色关键时刻揭露项目隐患!

项目有风险 今天下午15点,团队成员D向他的主管Z反馈他测试的项目有风险:项目在测试周期内,但在用例评审时发现有一处功能逻辑有争议,需要产品经理跟业务方确认,可能出现的情况有: 1.不变更需求&#xff0…

day2·算法-快乐数-有效三角形个数

今天又来更新啦,准备蓝桥杯的小伙伴可以和我一起来刷题,建议大家先看题,整理出思路,再看如何用简单的写法将思路构建出来,然后优化细节,找到解决某些例外出现的方法,从而成功解答这道题。 快乐…

leetcode 67. 二进制求和

一、题目 二、解答 1.思路 1.1 思路1 转成2个二进制数字相加,之后再转回字符串 1.2 思路2 遍历字符串挨个相加: 补齐2个字符串到同样长度 while循环,如果指针>0不断循环如果a短,给字符串前插入(a长度-b长度&a…

万户 ezOFFICE ezflow_gd.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Linux系统使用超详细(十)~vi/vim命令①

vi/vim命令有很多,其实只有少数的用法对于我们日常工作中起到了很大帮助,但是既然我选择梳理Linux的学习笔记,那么一定全力把自己的理解和学习笔记的内容认真整理汇总,内容或许有错误,还请发现的C友们发现了及时指出。…

day-11 统计整数数目

注:无思路 参考答案 code class Solution {static final int N 23;static final int M 401;static final int MOD 1000000007;int[][] d;String num;int min_sum;int max_sum;public int count(String num1, String num2, int min_sum, int max_sum) {d new in…

通过生成mcs、bin文件将程序固化到FPGA

通过将程序固化到FPGA,可以做到断电不丢失程序,上电之后就自动启动程序的作用,整个固化步骤主要分为3步,一是修改约束文件,二是生成mcs或bin文件,三是将程序固化到开发板flash 1.修改约束文件 生成固化文…

远程开发之vscode端口转发

远程开发之vscode端口转发 涉及的软件forwarded port 通过端口转发,实现在本地电脑上访问远程服务器上的内网的服务。 涉及的软件 vscode、ssh forwarded port 在ports界面中的port字段,填需要转发的IP:PORT,即可转发远程服务器中的内网端…

多行SQL转成单行SQL

如下图所示 将以上多行SQL转成单行SQL 正则表达式如下 (?s)$[^a-zA-Z()0-9]*结果如下 灵活使用,也未必只能使用Sublime Text 提供了一个在线工具

STM32快速复制MX25L1606E系列Flash

去年做了一个使用RS485对PIC18F45K80系列单片机进行在线升级的程序,如果是小批量的出厂烧录程序和升级验证(出厂前肯定要测试单片机是否能正常读写Flash)是可以的,但是后来产品订单量很大,生产线的烧录及升级验证就很缓…

【C语言基础考研向】03混合运算和printf讲解

一.混合运算 类型强制转换场景 整型数进行除法运算时&#xff0c;如果运算结果为小数&#xff0c;那么存储浮点数时一定要进行强制类型转换&#xff0c;请看下面例子 #include <stdio.h> int main() {int i5;float fi/2; //这里做的整型运算printf("%f\n",f…