# 官方文档
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly
because CPython’s memory management isnot thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
"""
1.在CPython解释器中存在全局解释器锁简称GIL
python解释器有很多类型
CPython JPython PyPython (常用的是CPython解释器)
2.GIL本质也是一把互斥锁 用来阻止同一个进程内多个线程同时执行(重要)
3.GIL的存在是因为CPython解释器中内存管理不是线程安全的(垃圾回收机制)
垃圾回收机制
引用计数、标记清除、分代回收
GIL只存在于CPython解释器中,不是python的特征
GIL是一把互斥锁用于阻止同一个进程下的多个线程同时执行
原因是因为CPython解释器中的垃圾回收机制不是线程安全的
反向验证GIL的存在 如果不存在会产生垃圾回收机制与正常线程之间数据错乱
GIL是加在CPython解释器上面的互斥锁
同一个进程下的多个线程要想执行必须先抢GIL锁 所以同一个进程下多个线程肯定不能同时运行 即无法利用多核优势
强调:同一个进程下的多个线程不能同时执行即不能利用多核优势
python是垃圾 速度太慢 有多核都不能用
反怼:虽然用一个进程下的多个线程不能利用多核优势 但是还可以开设多进程!!!
再次强调:python的多线程就是垃圾!!!
反怼:要结合实际情况
如果多个任务都是IO密集型的 那么多线程更有优势(消耗的资源更少)
多道技术:切换+保存状态
如果多个任务都是计算密集型 那么多线程确实没有优势 但是可以用多进程
CPU越多越好
以后用python就可以多进程下面开设多线程从而达到效率最大化
"""1.所有的解释型语言都无法做到同一个进程下多个线程利用多核优势
2.GIL在实际编程中其实不用考虑
验证GIL的存在
from threading import Thread
num = 100deftask():
global num
num -= 1
t_list = []
for i in rang(100):
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(num)
GIL与普通互斥锁
既然CPython解释器中有GIL 那么我们以后写代码是不是就不需要操作锁了!!!
"""
GIL只能够确保同进程内多线程数据不会被垃圾回收机制弄乱
并不能确保程序里面的数据是否安全
"""import time
from threading import Thread,Lock
num = 100deftask(mutex):
global num
mutex.acquire() # 加锁
count = num
time.sleep(0.1)
num = count - 1
mutex.release() # 解锁
mutex = Lock()
t_list = []
for i inrange(100):
t = Thread(target=task,args=(mutex,))
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(num) # 等待线程运行完毕再打印"""
GIL是一个纯理论知识, 在实际工作中不同考虑它的存在,
GIL作用面很窄, 仅限于解释器级别
"""
# 多进程 from multiprocessing import Process
import time
defwork():
res = 1for i inrange(1, 10000):
res *= i
if __name__ == '__main__':
# print(os.cpu_count()) # 8 可以获取计算机的CPU个数
start_time = time.time()
p_list = []
for i inrange(8):
p = Process(target=work)
p.start()
p_list.append(p)
for p in p_list:
p.join()
print('总耗时:%s' % (time.time() - start_time))
总耗时:0.19758033752441406# 多线程 from threading import Thread
from multiprocessing import Process
import os
import time
defwork():
res = 1for i inrange(1, 10000):
res *= i
if __name__ == '__main__':
# print(os.cpu_count()) # 8 可以获取计算机的CPU个数
start_time = time.time()
p_list = []
for i inrange(8):
p = Process(target=work)
p.start()
p_list.append(p)
for p in p_list:
p.join()
t_list = []
for i inrange(8):
t = Thread(target=work)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print('总耗时:%s' % (time.time() - start_time))
总耗时:0.322171688079834"""
计算密集型
多进程
0.19758033752441406
多线程
0.322171688079834
所以多进程好
"""
IO密集型
# 多线程from threading import Thread
import time
defwork():
time.sleep(2) # 模拟纯IO操作if __name__ == '__main__':
start_time = time.time()
t_list = []
for i inrange(100):
t = Thread(target=work)
t.start()
for t in t_list:
t.join()
print('总耗时:%s' % (time.time() - start_time))
# 总耗时:0.011942148208618164# 多进程defwork():
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
p_list = []
for i inrange(100):
p = Process(target=work)
p.start()
for p in p_list:
p.join()
print('总耗时:%s' % (time.time() - start_time))
# 总耗时:0.5508136749267578"""
IO密集型
多线程
0.011942148208618164
多进程
0.5508136749267578
结论:
多线程更好
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统