python之GIL

GIL(global interpreter lock),即全局解释器锁

在单核时代,崇尚优美、清晰、简单的 Python 之父选择在解释器层面实现了一把全局互斥锁,来保护 Python 对象从而实现对单核 CPU 的使用率,这种做法在单核时代很奏效。倘若在单核时未选择 GIL,那么开发者就需要自己实现任务的管理,这样做对于 CPU 的利用率提高无法做到极致。
  但是随着多核时代的到来,高效地利用 CPU 核心的有效方法就是使用并行性,多线程是充分实现并行的好方法,但是 CPython 的 GIL 却阻碍了对多核 CPU 的利用。

2.1 GIL的作用:
防止多线程竞争: GIL确保同一时刻只有一个线程执行Python字节码。
限制CPU密集型任务的并行性,简化内存管理: 对于CPU密集型任务,由于GIL的存在,多线程无法充分利用多核CPU,因为在任何给定时刻,只有一个线程能够执行Python字节码。
2.2 GIL的本质:
GIL实际上是一个互斥锁,在Python解释器层面上实现。由于GIL的存在,同一时刻只有一个线程能够获得解释器的控制权,其他线程被阻塞,无法执行Python字节码。这意味着在多核CPU上,Python的多线程程序可能无法充分利用多核性能。

2.3. GIL的影响:
CPU密集型任务受限: 对于CPU密集型任务,由于GIL的存在,多线程并不能有效地提高性能,因为多个线程无法同时执行Python字节码。
IO密集型任务相对不受限: 在IO密集型任务中,线程在等待IO时会释放GIL,允许其他线程执行Python字节码,因此在这种情况下,多线程能够发挥一定作用。
2.4. GIL的工作原理:
互斥锁机制: GIL是一个互斥锁,它在解释器级别上控制对Python对象和内存管理的访问。只有一个线程能够获得GIL的锁,执行Python字节码,其他线程则被阻塞等待。
执行Python字节码的时间片: 当一个线程持有GIL并执行Python字节码时,会执行一段时间,称为时间片。一旦时间片用完或发生阻塞IO操作,线程会释放GIL锁。
GIL的释放和竞争: 在等待的线程中,如果有线程释放了GIL(例如因为IO等待),其他线程会竞争获取GIL的锁。
3. 如何处理GIL的限制
3.1. 降低GIL的影响:
使用多进程: 多进程允许同时运行多个Python解释器,每个进程都有自己的GIL。这样可以绕过GIL的限制。
使用C扩展: 编写一些Python的关键部分为C扩展,这些部分在执行时不受GIL的影响,例如numpy、pandas等。
使用异步编程: 使用异步编程模型(例如asyncio库)可以最大程度地减少对线程的依赖,避免GIL对程序性能的影响。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git操作(二)

之前我们对于git已经有了一定的了解,现在我们学习一些关于git的新内容。 一.修改⽂件 首先,我们先来认识一个命令: git status //⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改,注意指的是仓库和工作区对比 关于三区的内容&#xff…

如何有效利用API接口进行数据采集

在当今数字化的世界中,API(应用程序编程接口)作为数据交换的桥梁,对于电商企业来说尤为重要。它们允许企业从丰富的数据源中提取必要的信息,为商业决策提供数据支持。本文将围绕如何高效地利用API进行数据采集展开讨论…

实际生产中的一次非典型的基于jmeter的接口自动化实践

实际工作中遇到过一次自动化巡检的需求,作为测试人员没法从源代码入手,加之数据库也不熟悉,故采取接口自动化的方式来实现巡检,算是一种歪门邪道吧,应该不是接口自动化的常规使用方式。jmeter在这里的作用实际上也只是…

docker安装一系列镜像

启动docker systemctl start docker docker 启动已经停止的容器 docker start idOrName PS:idOrName为容器的id或者名称 1、安装mysql镜像 拉取mysql5.7的镜像 docker pull mysql:5.7 查看镜像 docker images 启动mysql #启动mysql docker run --name mysql…

云呐电网智能运维包含哪些?智能运维都有哪些框架

电网智能运维是一个复杂的系统,包括多种技术和方法,为提升电力系统的效率和稳定性。以下是你提出的问题的实际答案: 网络智能运维的核心技术与应用: 故障检测:根据实时监测和数据分析,对电网中的故障进行快速、准确的…

C++递归复习3

输出n~1的整数 #include<bits/stdc.h> using namespace std; int n; void f(int); int main() {cin>>n;f(n);return 0; } void f(int n){if(n0) return;cout<<n<<endl;f(n-1); }求10097......41的值 #include<bits/stdc.h> using namespace st…

k8s容器以及基础设施优化

1.硬件系统选型&#xff1a;宿主机通用配置16c/32GB/4网卡队列 2.os优化&#xff1a;单机支持百万tcp并发&#xff0c;/etc/sysctl.conf,/etc/security/limits.conf 3.k8s&容器层优化&#xff1a;性能优化initContainer 4.kube-dns优化&#xff1a;增大--cache-size,设置…

LabVIEW读取excel日期

LabVIEW读取excel日期 | Excel数据表格中有日期列和时间列&#xff0c;如下表所示&#xff1a; 通过LabVIEW直接读取Excel表格数据&#xff0c;读出的日期列和时间列数据与原始表格不一致&#xff0c;直接读出来的数据如下表所示&#xff1a; 日期、时间列数据异常 问题产生原因…

VBA:批量复制sheet内指定内容

VBA. 批量复制sheet内指定内容 背景&#xff1a;一个excel内有包含0-18序号的Sheet&#xff0c;需要将1-18的sheet内包含标准差的行复制到sheet”0“中。 方法&#xff1a; 从1-18遍历sheet&#xff0c;找到单元格值为”标准差“的行&#xff0c;然后&#xff08;仅复制值&a…

docker安装milvus后,无法打开attu,日志报错

背景&#xff0c;在虚拟机用docker安装milvus后&#xff0c;正常访问attu&#xff0c;过段时间挂机后无法访问 日志报错&#xff1a; [2024/02/19 06:59:46.761 00:00] [ERROR] [grpcclient/client.go:330] ["ClientBase ReCall grpc second call get error"] [rol…

ThreadLocal(4):ThreadLocal的核心方法源码

基于ThreadLocal的内部结构&#xff0c;我们继续分析它的核心方法源码&#xff0c;更深入的了解其操作原理。 除了构造方法之外&#xff0c; ThreadLocal对外暴露的方法有以下4个&#xff1a; 方法声明描述protected T initialValue()返回当前线程局部变量的初始值public voi…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…

C语言代码 递归实现n的k次方

递归实现n的k次方 代码示例&#xff1a; #include <stdio.h>double Pow(int n, int k) {if (k > 0){return n * Pow(n, k - 1);}else if (0 k){return 1;}else{return 1.0 / pow(n, -k);} } int main() {int n 0;int k 0;scanf("%d %d", &n, &…

[工具探索]VSCode介绍和进阶使用

相比较GoLand、PhpStorm、PyCharm、WebStorm的重量级内存占用&#xff0c;从Windows系统来&#xff0c;各种卡死&#xff0c;换到MacOS倒不会卡死&#xff0c;但是内存占用太多&#xff0c;影响体验&#xff0c;决定换到VSCode。当然这个过程需要适应过渡期&#xff0c;旧伙计都…

电脑文件误删除如何恢复?2024最新三种恢复方法

我们在使用电脑的过程中&#xff0c;随着时间的不断推移&#xff0c;渐渐的我们会发现C盘内存空间不足了。这是因为我们很多文件都默认存储在C盘&#xff0c;所以导致C盘空间不足&#xff0c;电脑运行越来越慢。那么电脑哪些文件可以删除&#xff0c;电脑删除的东西怎么恢复&am…

Vue:Vuex模块化编码(非常实用)

一、情景说明 通过前面的学习&#xff0c;我们知道&#xff0c;Vuex的核心文件就是indexc.js 这个文件里面&#xff0c;主要是四个对象 actions、mutations、state、getters 那么&#xff0c;随着业务的复杂化&#xff0c;所有的逻辑都写在一个actions里面吗&#xff1f; 显然…

【Mybatis】TypeHandler使用

引言 在使用MyBatis进行项目开发时&#xff0c;我们经常会遇到Java类型与数据库类型不匹配的情况。为了解决这一问题&#xff0c;MyBatis提供了一个强大的机制——TypeHandler。TypeHandler是MyBatis中一个用于处理Java类型和数据库类型转换的组件&#xff0c;它在MyBatis进行…

【微信小程序讲解——必看】

微信小程序详细介绍 1. 微信小程序2. 基本概念3. 开发方式4. 特点5. 功能范围6. 使用场景7. 用户界面8. API支持9. 安全与隐私10. 上线流程11. 运营规则 1. 微信小程序 微信小程序是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用…

There will be “7“ later: Interpretation of next-generation Wi-Fi technology

With the Wi-Fi Alliance announcing the launch of Wi-Fi 7-related certifications, we can also start talking about the new successor to Wi-Fi 6 three years after its launch. What is Wi-Fi 7? What benefits does it bring? These questions about Wi-Fi 7 will b…

Active Directory 的密码管理策略

员工使用的密码可以决定或破坏组织中的数据安全性&#xff0c;但是&#xff0c;知道员工通常不遵循良好的密码卫生习惯也就不足为奇了。从在本机工具&#xff08;如 Windows Active Directory 组策略&#xff09;中设置弱密码和通用密码到宽松的密码策略规则&#xff0c;有几个…