Python多线程之“锁机制”

锁(Lock)机制简述

锁这个字已经顾名思义了。有A和B两个线程,A和B中的程序都加了同一个锁对象,当线程A率先执行到lock.acquire(),线程B只能在A释放锁lock.release()后才能运行自身的lock.acquire()。

锁(Lock)机制使用

以下代码为如何获取锁,释放锁,获取锁lock.acquire()和释放锁lock.release()必须成对出现,否则会出现死锁的现象。

import threading
#生成全局唯一锁对象
lock = threading.Lock()
#获取锁,未获取到锁会阻塞程序,直至获取到锁才会往下执行
lock.acquire()
#释放锁,其他线程便可以获取该锁
lock.release()

很多时候会忘记释放锁,所以使用上下文管理器来加锁,with语句会在这个代码块执行前自动获取锁,在执行后自动释放锁。

import threading
lock = threading.Lock()
with lock:
#代码块
	pass

为什么要使用锁?

不用锁锁时的多线程。

import threading

def current():
	global n1
	n1 = 0
	for i in range(10):
		n1+=1
		print("current",n1)
def last():
	global n2
	n2 = 0
	for i in range(10):
		n2+=10
		print("last",n2)
if __name__ == "__main__":
	t1 = threading.Thread(target = current)
	t1.start()
	t2 = threading.Thread(target = last)
	t2.start()

看看不使用锁时候的运行结果:

current 1
current 2
current 3
last 10
current 4
current 5
last 20
current 6
last 30
last 40
current 7
current 8
current 9
last 50
last 60
current 10
last 70
last 80
last 90
last 100

两个线程是交替执行的,还是一种串行机制,不加锁输出会很混乱。

加了锁的多线程。

import threading

def current():
	global n1
	n1 = 0
	lock.acquire()
	for i in range(10):
		n1+=1
		print("current",n1)
	lock.release()
def last():
	global n2
	n2 = 0
	lock.acquire()
	for i in range(10):
		n2+=10
		print("last",n2)
	lock.release()
if __name__ == "__main__":
	lock = threading.Lock()
	t1 = threading.Thread(target = current)
	t1.start()
	t2 = threading.Thread(target = last)
	t2.start()

运行结果:

current 1
current 2
current 3
current 4
current 5
current 6
current 7
current 8
current 9
current 10
last 10
last 20
last 30
last 40
last 50
last 60
last 70
last 80
last 90
last 100

进程t1运行完之后才会运行进程t2,这个结果才是我们想要的运行结果,是不是有些道理233.

猜你喜欢

转载自blog.csdn.net/weixin_39549161/article/details/85884836
今日推荐