Python - threading Lock互斥锁 解决问题

多个线程或进程同时操作同一变量,可能会导致抢占资源的现象,变量不能按照预定的逻辑进行操作,这时,在改变变量前需要对变量加互斥锁,操作完成后释放互斥锁。

引用标准库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次运行后:

624998750000

实例化一个Lock类,锁对象

import threading

lock=threading.Lock()  #实例化一把锁

Lock.acquire()获取一把锁

获取锁定,阻止或非阻止。

当阻塞参数设置为True(默认值)时调用,阻塞直到解锁,然后将其设置为锁定并返回True。

在使用阻塞参数设置为的情况下调用时False,请勿阻止。如果一个带阻塞的调用设置为True阻塞,则False 立即返回; 否则,将锁定设置为锁定并返回True。

Lock.release()释放这把锁 / 解锁

锁定锁定后,将其重置为解锁状态,然后返回。如果阻止任何其他线程等待锁解锁,则只允许其中一个继续执行。

在未锁定的锁上调用时,ThreadError会引发a

没有回报价值。

使用 with 语句来控制锁

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 条评论) “”
   
验证码:

相关文章

推荐文章