# 1.先验证GIL的存在from threading import Thread
data = 5defnum(i):
global data
data -= 1print(f'第{i}次取值结果:{data}')
for i inrange(1,6):
t = Thread(target=num,args=(i,))
t.start()
运行结果:
第1次取值结果:4
第2次取值结果:3
第3次取值结果:2
第4次取值结果:1
第5次取值结果:0'''
联想昨天的内容:
两个厨师线程一起做饭,饭做好的顺序会有颠倒,说明线程运行运行有快有慢,没有固定顺序
但是在操作数据时却是按照顺序取出,说明python的数据存在GIL锁
'''# 2.再验证不同数据加不同锁from threading import Thread,Lock
# mutex = Lock()
data = 5
t_list = []
defnum():
global data
# mutex.acquire() # 抢锁
a = data
time.sleep(0.1)
data = a-1# mutex.release() # 放锁for i inrange(5):
t = Thread(target=num)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(data)
运行结果:
4
加锁后运行结果:
0'''
GIL锁只用于对解释器级别的数据修改,当修改赋值方式后,出现无五个线程取的data都是5
我们自行加锁后就成功让线程挨个操作data
'''"""
GIL是一个纯理论知识 在实际工作中根本无需考虑它的存在
GIL作用面很窄 仅限于解释器级别
后期我们要想保证数据的安全应该自定义互斥锁(使用别人封装好的工具)
"""
验证多线程作用
"""
两个大前提
CPU的个数
单个
多个
任务的类型
IO密集型:经常拿走CPU使用
计算密集型:一直占着CPU
"""# 单个CPU
多个IO密集型任务
多进程:浪费资源 无法利用多个CPU
多线程:节省资源 切换+保存状态
多个计算密集型任务
多进程:耗时更长 创建进程的消耗+切换消耗
多线程:耗时较短 切换消耗
'''多线程优势非常明显'''# 多个CPU
多个IO密集型任务
多进程:浪费资源 多个CPU无用武之地
多线程:节省资源 切换+保存状态
多个计算密集型任务
多进程:利用多核 速度更快
多线程:速度较慢
'''多个IO密集型任务多线程更有优势
多个计算密集型任务多进程更有优势'''
结论:多进程和多线程都有具体的应用场景 尤其是多线程并不是没有用!!!
'''代码验证'''import os
from multiprocessing import Process
from threading import Thread
import time
defwork():
res = 1for i inrange(1,10000):
res *= i
# if __name__ == '__main__':# print(os.cpu_count()) # 八核# list = []# start_time = time.time()# for i in range(8):# p = Process(target=work)# p.start()# list.append(p)## for p in list:# p.join()# end_time = time.time()# print(f'耗时:{start_time-end_time}') #耗时:-0.27302050590515137
list_t = []
start_time = time.time()
for i inrange(8):
t = Thread(target=work)
t.start()
list_t.append(t)
for t in list_t:
t.join()
end_time = time.time()
print(f'耗时:{start_time-end_time}') # 耗时:-0.35170841217041016"""
计算密集型
多进程
0.27302050590515137(一万次运算)
27.649538278579712(十万次运算)
多线程
0.35170841217041016(一万次运算)
76.02150464057922(十万次运算)
我用了一万次计算模拟,结果差了将近一秒
当模拟十万次运算的时候,结果差了将近两倍
结论
多进程更好,且处理的运算越多,优势越明显
"""defwork():
time.sleep(2) # 模拟纯IO操作if __name__ == '__main__':
start_time = time.time()
# t_list = []# for i in range(100):# t = Thread(target=work)# t.start()# for t in t_list:# t.join()
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))
"""
IO密集型
多线程
总耗时:1.0338587760925293
多进程
总耗时:2.7993712425231934
两者翻了
结论
多线程更好
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?