只要是线程就会有锁!
GIL锁:控制的CPU执行一次只能执行一个线程。
自己加锁:确保执行完一个线程,才会切换下一个线程。
# 一个数字100,让100次线程执行-1操作,最后结果为0
# 因为每一个线程中没有任何阻塞或者time.sleep()
import threading
def SubNum(): # 定义一个减法函数
global num # 在函数内操作全局变量
num -=1 # -1操作
num = 100 # 全局变量100
thread_list = [] # 储存100个线程
for i in range(100): # 执行100次线程
t = threading.Thread(target=SubNum,)
t.start()
thread_list.append(t) # 执行的每一个线程都添加到一个空列表里去
for t in thread_list: # 遍历所有线程
t.join()
print("最后一个数字:", num) # 执行完100线程后的num
----------------------------------------------------------------------------------------------------------------------------------
多一步操作
import time import threading
def SubNum():
global num
temp = num # 多了一步操作,CPU花的时间比较就多一点
time.sleep(0.0001) # CPU切换线程
num = temp-1
num = 100
thread_list = []
for i in range(100):
t = threading.Thread(target=SubNum,)
t.start()
thread.append(t)
for t in thread_list:
t.join()
print("最后一个数字:", num)
运行结果:
最后一个数字:91 # 数字不固定
-----------------------------------------------------------------------------------------------------------------------------------
同步锁:
遇到任何阻塞或者time.sleep()都会执行完才切换线程。
import time import threading
def SubNum():
dlobal num
r.acquire() # 2 打开这把锁
temp = num
time.sleep(0.0001)
num = temp-1
r.release() # 3 释放这把锁
num = 100
r = thread.Lock() # 1 定义一个锁
thread_list = []
for i in range(100):
t = threading.Thread(target=SubNum)
t.start()
thread_list.append(t)
for t in thread_list:
t.join() # 所有线程执行完才执行后面代码
print("最后一个数字:",num)
运行结果:
最后一个数字:0