多个线程或进程同时操作同一变量,可能会导致抢占资源的现象,变量不能按照预定的逻辑进行操作,这时,在改变变量前需要对变量加互斥锁,操作完成后释放互斥锁。
引用标准库threading模块 Lock类来解决这个问题
import threading
number=0
lock=threading.Lock() #实例化一把互斥锁
def add():
global number
for i in range(500000):
# with lock:
lock.acquire() #获取锁定
number+=i #将多线程可能同时操作的数据代码块放在 这里
lock.release() #解锁
threads_list=[]
for i in range(5):
t=threading.Thread(target=add)
t.start()
threads_list.append(t)
for t in threads_list: #让主线程等待所有子线程计算结束后,再执行后面的打印
t.join()
print(number) #624998750000
第1次运行后(加锁后,运行速度变慢):
各个线程排队操作加锁后的变量,所以速度变慢
624998750000第2次运行后:
624998750000第3次运行后:
624998750000import threading
lock=threading.Lock() #实例化一把锁获取锁定,阻止或非阻止。
当阻塞参数设置为True(默认值)时调用,阻塞直到解锁,然后将其设置为锁定并返回True。
在使用阻塞参数设置为的情况下调用时False,请勿阻止。如果一个带阻塞的调用设置为True阻塞,则False 立即返回; 否则,将锁定设置为锁定并返回True。
锁定锁定后,将其重置为解锁状态,然后返回。如果阻止任何其他线程等待锁解锁,则只允许其中一个继续执行。
在未锁定的锁上调用时,ThreadError会引发a
没有回报价值。
import threading
number=0
lock=threading.Lock()
def add():
global number
for i in range(500000):
with lock: #使用with 语句来控制锁
number+=i #将多线程可能同时操作的数据代码块放在 这里
threads_list=[]
for i in range(5):
t=threading.Thread(target=add)
t.start()
threads_list.append(t)
for t in threads_list:
t.join()
print(number) #624998750000 | 留言与评论(共有 0 条评论) “” |