python 线程同步互斥方式 -- 线程event(事件))和线程锁

python 线程同步互斥方式 -- 线程event & 线程锁

          • 线程event
            • 语法
            • 示例
          • 线程锁(互斥锁)
            • 作用
            • 语法
            • 示例

线程event
语法
from threading import Event

e = Event()  		#创建线程event对象,e有两个状态,被设置和未被设置的状态
e.wait([timeout])  	#阻塞等待e被set,e被设置后,wait()就是非阻塞的,非阻塞会返回True
e.set()  		#设置e,使wait结束阻塞
e.clear() 		#使e回到未被设置状态
e.is_set()  		#查看当前e是否被设置
示例
from threading import Thread,Event

s = None
#创建线程事件对象
e = Event()

#分支线程函数
def 杨子荣():
	print('杨子荣前来拜山头')
	#修改共享资源 s
	global s
	s = '天王盖地虎'
	#设置e,结束wait()阻塞
	e.set()

#创建分支线程对象
t = Thread(target=杨子荣)
#创建分支线程并执行
t.start()

#主线程做的事
#由于主线程和分支线程间对资源是抢占式关系,万一主线程先抢占到共享资源s,则会'打死他'
#为了避免这种情况,则需加线程event
print('说对口令就是自己人')
#阻塞等待杨子荣先设置s的值(即阻塞等待e被set)
e.wait()
if s == '天王盖地虎':
	print('宝塔镇河妖')
	print('确认过眼神,你是对的人')
else:
	print('打死他')

t.join()	
线程锁(互斥锁)
作用

线程间在操作全局变量(共享资源)时,是没发控制他们的来回切换的(引发不确定性),为了消除这种不确定性,需要加互斥锁(保证原子性)

语法
from threading import Lock

lock = Lock()		#创建锁对象
lock.acquire()		#上锁,若lock已经上锁再调用会阻塞
lock.release()		#解锁
with lock:		#上锁(代码执行完自动解锁)
示例
from threading import Thread,Lock

a = b =0
#创建锁对象
lock = Lock()

#分支线程函数,和主线程是抢占时间片关系
def value()
	#此处若不加锁,可能出现这种情况:主线程执行完a += 1,分支线程正好开始执行,if a != b: 成立
	#为了保证多线程的原子性,此处必须上锁
	lock.acquire()
	while True:
		if a != b:
			print('a = %d,b = %d'%(a,b))
	lock.release()	#解锁

t = Thread(target=value)

#创建线程并执行
t.start()

#以下代码主线程会执行
#若不上锁,由于主线程和分支线程共享进程资源(全局变量a,b),主线程对a,b的操作会影响子线程的执行
#此处上锁,一旦主线程或分支线程抢到了唯一这把锁,剩下的那个线程只能等抢到锁的线程执行完才能执行
while True:
	with lock:	 #上锁
	a += 1
	b += 1
			#自动解锁
	
t.join()

你可能感兴趣的:(python,#线程,python,线程锁,同步互斥,线程event)