Python的全局锁GIL解析

news2024/11/6 23:32:17

在这里插入图片描述

Python的全局锁(GIL)是 CPython 解释器实现中的一个机制,用来确保任何时候只有一个线程执行 Python 字节码。这一机制存在于 CPython 中,主要是为了确保线程操作中的数据一致性,但也因此限制了多线程的并行执行效率。尤其是在多核 CPU 上,GIL 使得 CPU 的多核优势难以在纯 Python 的多线程程序中得到完全利用。

GIL 的基本知识

  • 作用:GIL 保证在 CPython 中,同时只能有一个线程执行 Python 代码(即字节码)。
  • 原因:CPython 的许多内建对象(如字典、列表等)不是线程安全的。通过使用 GIL,CPython 避免了在这些对象上加锁,从而简化了对象的内存管理。
  • 影响:GIL 会使得多线程程序在多核 CPU 上无法完全并行,导致在 CPU 密集型任务中表现不佳。但是对于 I/O 密集型的任务(如网络 I/O、文件读写等),GIL 的影响相对较小。

CPython 实现 GIL 的基本原理

在 CPython 中,GIL 被实现为一个互斥锁。每次只有持有 GIL 的线程才能执行 Python 字节码,其它线程则处于等待状态。GIL 的执行流程如下:

  1. 一个线程持有 GIL 时,可以执行 Python 代码。
  2. 执行一段时间后,线程会释放 GIL,让其他线程有机会获得它(在 CPython 中通常会计数 Python 的指令)。
  3. 另一个线程获得 GIL 并开始执行。
简化 C++ 示例:模拟 GIL 的作用

以下代码模拟了 GIL 在多线程中的作用。它展示了如何使用一个全局互斥锁来控制线程执行的访问权限。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex gil; // 模拟 GIL

void python_thread(int thread_id) {
    for (int i = 0; i < 5; ++i) {
        std::lock_guard<std::mutex> lock(gil); // 获得“GIL”
        std::cout << "线程 " << thread_id << " 正在执行 Python 代码, i = " << i << std::endl;
    } // 离开作用域时自动释放“GIL”
}

int main() {
    std::thread t1(python_thread, 1);
    std::thread t2(python_thread, 2);

    t1.join();
    t2.join();

    return 0;
}

在这个示例中,我们模拟了 GIL 的作用,通过 std::mutex 来控制每个线程对共享资源的访问。这段代码展示了线程如何在每次需要执行 Python 代码时获取 GIL,其他线程必须等待直到 GIL 被释放。

Python 中多线程的简单示例

以下 Python 代码展示了 GIL 对多线程程序的影响。在这个例子中,我们使用了 CPU 密集型的计算,观察到 GIL 的存在会导致多线程表现不如预期。

import threading
import time

def cpu_bound_task():
    x = 0
    for _ in range(100000000):
        x += 1
    print("完成计算")

# 启动两个线程执行 CPU 密集型任务
start_time = time.time()
t1 = threading.Thread(target=cpu_bound_task)
t2 = threading.Thread(target=cpu_bound_task)
t1.start()
t2.start()
t1.join()
t2.join()
end_time = time.time()

print(f"总耗时: {end_time - start_time} 秒")

在这个 Python 代码中,两个线程分别执行同样的 CPU 密集型任务,但因为 GIL 的存在,它们并不能并行运行。执行时间通常会接近单线程的 2 倍,而不是预期中的加速。

总结

  • GIL 是什么:GIL 是一个全局锁,确保同一时间只有一个线程执行 Python 字节码。
  • GIL 的原因:主要为了保证数据一致性,避免加锁带来的复杂性。
  • GIL 的影响:GIL 限制了多核 CPU 上的 Python 多线程性能表现,尤其是在 CPU 密集型任务中;但对于 I/O 密集型任务,影响较小。

通过示例代码,我们可以看到 GIL 如何限制了多线程 Python 程序的并行性。在实际应用中,Python 程序员可以通过使用多进程(而不是多线程)来避开 GIL 的影响,或者使用如 CythonNumpy 等基于 C 实现的库来提高性能。

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

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

相关文章

ELK的ElasticStack概念

目录 传送门前言一、ElasticStack是什么二、ElasticStack数据格式1、Elasticsearch的概述2、Elasticsearch核心概念&#xff08;1&#xff09;接近实时&#xff08;NRT&#xff09;&#xff08;2&#xff09;集群&#xff08;cluster&#xff09;&#xff08;3&#xff09;节点…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

如何将ppt转换成word文档?8款ppt转word免费的软件大揭秘,值得收藏!

在日常办公中&#xff0c;将ppt转换成word文档的需求日益增长。这种需求源自多个方面&#xff0c;比如制作详尽的报告、创建课程讲义&#xff0c;或者将信息转化为可编辑的格式。作为一种普遍使用的演示工具&#xff0c;ppt在许多商业环境中扮演着重要角色。然而&#xff0c;随…

pandas——DataFrame

一、dataframe &#xff08;一&#xff09;创建dataframe file.csv Name,Age,City Alice,30,New York Bob,25,Los Angeles Charlie,35,Chicagoimport pandas as pd 1.使用字典创建DataFrame&#xff1a; 其中字典的键是列名&#xff0c;值是数据列表。print(1.使用字典创建D…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

青出于“蓝”的合资第一新能源,“换壳”背后有门道

文/王俣祺 导语&#xff1a;千呼万唤始出来的新能源“马6”终于亮相了&#xff0c;这款马自达EZ-6本以为凭借马自达多年来在国内市场深耕的底蕴可以收获一片支持&#xff0c;但最近却深陷“换壳”风波。那么今天我们就一起看看&#xff0c;这款马自达EZ-6和被冠以“原型”的深蓝…

Github上的十大RAG(信息检索增强生成)框架

信息检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种强大的技术,能够显著提升大型语言模型的性能。RAG框架巧妙地结合了基于检索的系统和生成模型的优势,可以生成更加准确、符合上下文、实时更新的响应。随着对先进人工智能解决方案需求的不断增长,GitHub上涌现出…

【小白学机器学习28】 统计学脉络+ 总体+ 随机抽样方法

目录 参考书&#xff0c;学习书 0 统计学知识大致脉络 1 个体---抽样---整体 1.1 关于个体---抽样---整体&#xff0c;这个三段式关系 1.2 要明白&#xff0c;自然界的整体/母体是不可能被全部认识的 1.2.1 不要较真&#xff0c;如果是人为定义的一个整体&#xff0c;是可…

5、片元着色器之基础光照模型:Phong模型和Blinn-Phong模型

1、什么是Phong光照模型&#xff1f; Phong模型就是在兰伯特模型的基础上增加了镜面反射光的计算。具体来说&#xff0c;兰伯特模型只考虑漫反射光&#xff0c;而Phong模型在此基础上引入了镜面反射光的概念&#xff0c;以模拟光线在光滑表面反射时产生的高光效果。镜面反射光的…

Ubuntu使用Qt虚拟键盘,支持中英文切换

前言 ​ 最近领导给了个需求&#xff0c;希望将web嵌入到客户端里面&#xff0c;做一个客户端外壳&#xff0c;可以控制程序的启动、停止、重启&#xff0c;并且可以调出键盘在触摸屏上使用(我们的程序虽然是BS架构&#xff0c;但程序还是运行在本地工控机上的)&#xff0c;我…

ES(ElaticSearch)详解(含工作原理、基本知识、常见问题和优化方法)

文章目录 一、Lucene 和 ELK 的组成二、ES 配置文件参数解读三、ES 基本知识1、索引&#xff08;Index&#xff09;&#xff1a;类似于关系型数据库的工作表2、类型&#xff08;Type&#xff09;&#xff1a;废弃3、文档&#xff08;Document&#xff09;&#xff1a;类似于关系…

巨好看的登录注册界面源码

展示效果 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevic…

记一次:使用使用Dbeaver连接Clickhouse

前言&#xff1a;使用了navicat连接了clickhouse我感觉不太好用&#xff0c;就整理了一下dbeaver连接 0、使用Navicat连接clickhouse 测试连接 但是不能双击打开&#xff0c;可是使用命令页界面&#xff0c;右键命令页界面&#xff0c;然后可以用sql去测试 但是不太好用&#…

ts:使用fs内置模块简单读写文件

ts&#xff1a;使用fs内置模块简单读写文件 一、主要内容说明二、例子&#xff08;一&#xff09;、fs模块的文件读写1.源码1 &#xff08;fs模块的文件读写&#xff09;2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 在ts中&#xff0c;我们可以使用内置的fs模块来…

RFID技术让档案管理更高效、更可靠

RFID档案应用&#xff0c;即利用射频识别技术对档案进行管理&#xff0c;其价值主要体现在以下几个方面&#xff1a; PART01效率提升 RFID技术通过无线射频识别&#xff0c;能够快速、准确地识别档案信息&#xff0c;大大提高了档案管理的效率。在传统的档案管理中&#xff0c;…

《数字图像处理基础》学习04-图像的量化

在上一篇文章中&#xff0c;已经实现了对图像的采样。 《数字图像处理基础》学习03-图像的采样-CSDN博客 接着就需要对图像进行量化操作。 目录 一&#xff0c;量化的相关概念 二&#xff0c;matlab编写程序生成量化图像 1&#xff0c;要求 2&#xff0c;思路及注意点…

逻辑代数的基本公式

根据图中的逻辑运算符号&#xff0c;包括与非逻辑&#xff08;NAND&#xff09;、或非逻辑&#xff08;NOR&#xff09;、与或非逻辑、异或逻辑&#xff08;XOR&#xff09;和同或逻辑&#xff08;XNOR&#xff09;&#xff0c;我们可以分别给出每个运算符的真值表。 1. 与非逻…

iptables面试题

1、详述iptales工作流程以及规则过滤顺序&#xff1f; iptables过滤的规则顺序是由上至下&#xff0c;若出现相同的匹配规则则遵循由上至下的顺序 2、iptables的几个表以及每个表对应链的作用&#xff1f; Iptables有四表五链 Filter表 : Filter表是iptables中使用的默认表…

Java Collection/Executor DelayedWorkQueue 总结

前言 相关系列 《Java & Collection & 目录》《Java & Executor & 目录》《Java & Collection/Executor & DelayedWorkQueue & 源码》《Java & Collection/Executor & DelayedWorkQueue & 总结》《Java & Collection/Executor &a…