python GIL全局解释器锁原理、功能及应用示例
off999 2025-05-02 12:52 19 浏览 0 评论
GIL(Global Interpreter Lock)是Python解释器中的一个机制,它是一把全局锁,用于在同一时间内限制只有一个线程执行Python字节码。以下是GIL的原理、功能以及5个示例:
原理:
GIL是通过在解释器级别上对线程进行互斥来实现的。在解释器执行Python字节码时,GIL会锁定并只允许一个线程执行,其他线程则处于等待状态。
功能:
- 线程安全:GIL确保同一时间只有一个线程执行Python代码,避免了线程之间的竞争条件和数据访问冲突。
- 简化内存管理:GIL使得Python的内存管理更加简单,因为同一时间只有一个线程执行代码,无需考虑多线程环境下的内存分配和回收问题。
- 全局解释器锁:GIL是一个解释器级别的全局锁,对整个Python解释器进程起作用,而不仅仅是某个特定的线程。
示例:
多线程的计算密集型任务受限:
import threading
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
def calculate_fibonacci():
result = fibonacci(30)
print(result)
threads = []
for _ in range(5):
thread = threading.Thread(target=calculate_fibonacci)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
在计算斐波那契数列的示例中,由于GIL的存在,多个线程并发执行计算密集型任务时,实际上是交替进行的。
多线程的IO密集型任务提升性能:
import threading
import requests
def make_request(url):
response = requests.get(url)
print(response.text)
urls = ['http://example.com', 'http://google.com', 'http://python.org']
threads = []
for url in urls:
thread = threading.Thread(target=make_request, args=(url,))
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
在网络请求的示例中,由于大部分时间线程都在等待网络IO操作完成,多线程可以提升性能。
GIL对于多进程并发编程无影响:
import multiprocessing
def count_down(n):
while n > 0:
print(n)
n -= 1
processes = []
for i in range(5):
process = multiprocessing.Process(target=count_down, args=(10,))
process.start()
processes.append(process)
for process in processes:
process.join()
在多进程并发编程中,每个进程都有自己的Python解释器,因此GIL不会限制并行性能。
多线程的并发任务受限:
import threading
def print_numbers():
for i in range(10):
print(i)
def print_letters():
for letter in 'abcdefghij':
print(letter)
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
在多线程中,由于GIL的存在,两个线程的执行是交替进行的,而不是同时执行。
使用多线程进行并发的非CPU密集型任务:
import threading
import time
def task():
print("Task started")
time.sleep(1)
print("Task completed")
threads = []
for _ in range(5):
thread = threading.Thread(target=task)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
在非CPU密集型任务中,如等待时间或IO操作,多线程可以并发执行,提高程序的响应性能。
需要注意的是,GIL的影响因Python解释器的实现而异,不同版本的Python解释器可能会有不同的行为。在特定的应用场景中,可以考虑使用多进程、异步编程等方式来规避GIL的限制。
相关推荐
- 16《Python 办公自动化教程》钉钉群机器人配置
-
在互联网企业中,数字化办公早已经不是什么新鲜事了,其中以钉钉为代表的工具更是其中的主力军。目前公司中钉钉的使用已经较为普及,像钉钉打卡、钉钉会议室、钉盘等。本小节将针对钉钉群机器人进行介绍,助力利用钉...
- 15《Python 办公自动化教程》文件压缩与解压缩
-
压缩包也是我们平时工作中经常要接触到的文件格式,压缩文件后缀名通常有.zip、.rar、.7z等等。Python中也有专门用来操作压缩包文件的第三方模块zipfile。听这个名字就知道是用来操...
- 08《Python 办公自动化教程》smtplib 模块与 email 模块
-
日常办公中正式文件的发送都需要用到邮件,以及在互联网工作中,月度总结、销售报表、考评表等等都需要邮件进行发送。在不考虑办公自动化之前,你发送一封邮件的步骤是如何呢?第一步打开浏览器进入到邮箱登录界面,...
- 好用的五个python表格自动化工具,谁都可以复制直接用
-
引言在之前文章中,有一篇《这五个办公室常用自动化工具我用python帮你写好了,复制代码就能用》,没想到受到了广大读者的喜爱。其中进行了一个投票,总结发现很多读者对于excel的自动化需求非常高,...
- 1-Pytest全栈自动化测试指南- 运行
-
通常,使用命令调用pytest(有关调用pytest的其他方法,pytest请参见下文)。这将在名称遵循表单的所有文件中或在当前目录及其子目录中执行所有测试。更一般地说,pytest遵...
- Python40个自动化办公实战案例,终于实现下班自由啦~
-
拿来就能用,这么爽的吗?!今天我想聊聊,如何通过Python自动化工具,解决工作中常见的办公效率低下的问题。你有没有想过,下班晚,加班,可能是因为自己工作比较低效?回想一下,自己是不是也曾遇到过这样的...
- Python自动化 | 解锁高效办公利器,Python助您轻松驾驭Excel!
-
大家不论在日常工作还是生活中,都经常用到Excel这款办公软件,它在数据处理、报表生成等方面起到了重要作用。然而,作为一个Python工程师,你可知道Python也能成为操作Excel的得力助手吗?而...
- Python自动化办公实战:包含Word、Excel、Pdf和Email邮件案例
-
背景想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名、联系方式、邮箱等基本信息,然后你的老板现在需要替换邀请函模板中的姓名,然后将Word邀请函模板生成Pdf格式,之后...
- Python自动化办公学习笔记11——布尔类型、变量赋值、类型转换
-
1.布尔类型(Boolean)在Python中,布尔类型是整数类型的子类,其中`True`表示"真"或"是",`False`表示"假"或"否&...
- Python自动化办公应用学习笔记9——赋值语句、i...
-
1.赋值语句在程序中产生或计算值的代码称为表达式。Python语言中,等号(=)表示“赋值”操作,即将右侧表达式的计算结果赋给左侧的变量。包含等号(=)的语句称为赋值语句。同步赋值语句可以...
- Python自动化办公应用学习笔记13——表达式
-
1.表达式基础定义:表达式是代码中能计算并返回一个值的代码片段。组成:由操作数(变量、字面量)和操作符(运算符、函数调用)构成。特点:不包含语句(如if、for)、可嵌套(如(a+b)*...
- Python办公自动化之操作Excel(一)
-
处理Excel的库主要有xlrd、xlwt、xlwings和openpyxl。xlrd、xlwt、xlwings可以用于处理Excel2010文档之前的文档,而openpyxl是用于处理Excel...
- Python办公自动化系列篇之五:Web 自动化与数据提取
-
作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...
- Python自动化办公应用学习笔记18—— while循环
-
1.定义while循环(条件循环/无限循环)是Python中基于条件判断的循环结构。它不需要预先知道循环次数,只要条件满足就会持续执行代码块,直到条件变为False时停止。特别适合处理动态变...
- Python自动化办公应用学习笔记15——算法
-
针对各种类型的问题,拟定出有效的解决方法和步骤,也就是算法。可以说,设计算法是程序设计的核心。简单来说,为解决一个问题而采取的具体方法和操作步骤,就称为“算法”。比如在解决一个数值计算问题时,我们不仅...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 16《Python 办公自动化教程》钉钉群机器人配置
- 15《Python 办公自动化教程》文件压缩与解压缩
- 08《Python 办公自动化教程》smtplib 模块与 email 模块
- 好用的五个python表格自动化工具,谁都可以复制直接用
- 1-Pytest全栈自动化测试指南- 运行
- Python40个自动化办公实战案例,终于实现下班自由啦~
- Python自动化 | 解锁高效办公利器,Python助您轻松驾驭Excel!
- Python自动化办公实战:包含Word、Excel、Pdf和Email邮件案例
- Python自动化办公学习笔记11——布尔类型、变量赋值、类型转换
- Python自动化办公应用学习笔记9——赋值语句、i...
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)