# 先验证GIL的存在from threading import Thread,Lock
import time
money = 100for i inrange(100): # 创建一百个线程
t = Thread(target=task)
t.start()
print(money)
# 在验证不同数据加不同锁from threading import Thread, Lock
import time
money = 100
mutex = Lock()
deftask():
global money
mutex.acquire()
tmp = money
time.sleep(0.1)
money = tmp - 1
mutex.release()
'''
抢锁的简便写法(with上下文管理)
with mutex:
pass
'''
t_list = []
for i inrange(100): # 创建一百个线程
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
# 为确保结构正确 应该等待所有线程运行完毕在打印moneyprint(money)
'''
GIL是一个纯理论知识 在实际工作中无需考虑它的纯在
GIL作用面很窄,仅限于解释器级别
后期我们想要保证数据的安全应该自定义互斥锁(使用别人封装好的工具)
'''
验证多线程的作用
'''
两大前提
1.CPU个数
单个
多个
2.任务的类型
IO密集型
计算密集型
'''# 单个CPU
多个IO密集型任务
多进程:浪费资源 无法利用多个CPU
多线程:节省资源 切换+保存状态
多个计算密集型任务
多进程:耗时更长 创建进程的消耗+切换消耗
多线程:耗时较短 切换消耗
# 多个CPU
多个IO密集型任务
多进程:浪费资源 多个CPU无用武之地
多线程:节省资源 切换+保存状态
多个计算密集型任务
多进程:利用多核 速度更快
多线程:速度较慢
结论:多进程和多线程都有具体的应用场景 尤其是多线程并不是没有用!!!
# 代码验证from multiprocessing import Process
from threading import Thread
import time
defindex():
res = 1for i inrange(1, 50000):
res = i * res
if __name__ == "__main__":
start = time.time()
p_list = []
for i inrange(12):
p = Process(target=index)
p.start()
p_list.append(p)
for i in p_list:
i.join()
end = time.time()
print(end - start) # 5.524967670440674# start_time = time.time()# t_list = []# for i in range(12):# t = Thread(target=index)# t.start()# t_list.append(t)# for i in t_list:# i.join()# end_time = time.time()# print(end_time - start_time) # 12.41026759147644defwork():
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密集型
多线程
总耗时:0.007348060607910156
多进程
总耗时:0.1564030647277832
两者差了两个数量级
结论
多线程更好
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人