python 线程锁

threading.Lock锁

获取锁

Lock.acquire(blocking=True,timeout=-1)
获取锁,获取成功返回True,否则返回False
  • blocking - 阻塞状态,默认True为阻塞,False为非阻塞
  • 阻塞可以设置超时时间。非阻塞时,timeout禁止设置。如果超时依旧未获取到锁,返回False。

释放锁

Lock.rease()
  • 释放锁,可以从任何线程调用释放。
  • 已上锁的锁,会被设置为unlocked。如果未上锁调用,会抛出RuntimeError异常。

实例

创建要给非阻塞锁

import threading
import sys
import time

def print(*args):
    sys.stdout.write(" ".join(map(str,args))+"\n")

def worker(lock:threading.Lock):
    while True:
        if lock.acquire(False):
            print("do something.")
            time.sleep(1)
            lock.release()
            break
        else:
            print("try again")
            time.sleep(1)

lock = threading.Lock()
for i in range(5):
    threading.Thread(target=worker,name="w{}".format(i),args=(lock,)).start()

with + lock

import threading
import time
 
num=0  #全局变量多个线程可以读写,传递数据
mutex=threading.Lock() #创建一个锁
 
class Mythread(threading.Thread):
    def run(self):
        global num
        with mutex:   #with Lock的作用相当于自动获取和释放锁(资源)
            for i in range(1000000): #锁定期间,其他线程不可以干活
                num+=1
        print(num)
 
mythread=[]
for i  in range(5):
    t=Mythread()
    t.start()
    mythread.append(t)
for t in mythread:
    t.join()
print("game over")
 

with mutex:   #with表示自动打开自动释放锁
	for i in range(1000000): #锁定期间,其他人不可以干活
		num+=1
#上面的和下面的是等价的
if mutex.acquire(1):#锁住成功继续干活,没有锁住成功就一直等待,1代表独占
	for i in range(1000000): #锁定期间,其他线程不可以干活
	num+=1
	mutex.release() #释放锁

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×