# 1.先验证GIL的存在
from threading import Thread, Lock
import time
money = 100
def task():
global money
money -= 1
for i in range(100): # 创建一百个线程
t = Thread(target=task)
t.start()
print(money)
# 2.再验证不同数据加不同锁
from threading import Thread, Lock
import time
money = 100
mutex = Lock()
def task():
global money
mutex.acquire()
tmp = money
time.sleep(0.1)
money = tmp - 1
mutex.release()
"""
抢锁放锁也有简便写法(with上下文管理)
with mutex:
pass
"""
t_list = []
for i in range(100): # 创建一百个线程
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
# 为了确保结构正确 应该等待所有的线程运行完毕再打印money
print(money)
"""
GIL是一个纯理论知识 在实际工作中根本无需考虑它的存在
GIL作用面很窄 仅限于解释器级别
后期我们要想保证数据的安全应该自定义互斥锁(使用别人封装好的工具)
"""
二、验证多线程作用
"""
两个大前提
CPU的个数
单个
多个
任务的类型
IO密集型
计算密集型
"""# 单个CPU
多个IO密集型任务
多进程:浪费资源 无法利用多个CPU
多线程:节省资源 切换+保存状态
多个计算密集型任务
多进程:耗时更长 创建进程的消耗+切换消耗
多线程:耗时较短 切换消耗
# 多个CPU
多个IO密集型任务
多进程:浪费资源 多个CPU无用武之地
多线程:节省资源 切换+保存状态
多个计算密集型任务
多进程:利用多核 速度更快
多线程:速度较慢
结论:多进程和多线程都有具体的应用场景 尤其是多线程并不是没有用!!!
'''代码验证'''from threading import Thread
from multiprocessing import Process
import os
import time
# def work():# res = 1# for i in range(1, 10000):# res *= i### if __name__ == '__main__':# print(os.cpu_count()) # 12 查看当前计算机CPU个数# start_time = time.time()# p_list = []# for i in range(12):# p = Process(target=work)# p.start()# p_list.append(p)# for p in p_list:# p.join()# t_list = []# for i in range(12):# t = Thread(target=work)# t.start()# t_list.append(t)# for t in t_list:# t.join()# print('总耗时:%s' % (time.time() - start_time))"""
计算密集型
多进程
0.08273792266845703
多线程
0.28725099563598633
两者差了一个数量级(越多差距越大)
结论
多进程更好
"""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密集型
多线程
总耗时:0.007348060607910156
多进程
总耗时:0.1564030647277832
两者差了两个数量级
结论
多线程更好
"""
今日内容概要GIL与普通互斥锁区别验证多线程作用死锁现象信号量(了解)event事件(了解)进程池与线程池(重点)协程基于协程实现TCP服务端并发今日内容详细一、GIL与普通互斥锁区别# 1.先验证GIL的存在 from threading import Thread, Lock import time money = 100 def task(): global money money -= 1 for i in range(100)