Python如何实现条件变量同步

Python (207) 2023-05-23 00:05:57

条件变量同步

有一类线程需要满足条件之后才能够继续执行,Python提供了threading.Condition 对象用于条件变量线程的支持,它除了能提供RLock()或Lock()的方法外,还提供了 wait()、notify()、notifyAll()方法。

lock_con=threading.Condition([Lock/Rlock]): 锁是可选选项,不传人锁,对象自动创建一个RLock()。

wait():条件不满足时调用,线程会释放锁并进入等待阻塞;

notify():条件创造后调用,通知等待池激活一个线程;

notifyAll():条件创造后调用,通知等待池激活所有线程。

相关推荐:《Python视频教程》

importthreading,time
fromrandomimportrandint
classProducer(threading.Thread):
defrun(self):
globalL
whileTrue:
val=randint(0,100)
print('生产者',self.name,':Append'+str(val),L)
iflock_con.acquire():
L.append(val)
lock_con.notify()
lock_con.release()
time.sleep(3)
classConsumer(threading.Thread):
defrun(self):
globalL
whileTrue:
lock_con.acquire()
iflen(L)==0:
lock_con.wait()
print('消费者',self.name,":Delete"+str(L[0]),L)
delL[0]
lock_con.release()
time.sleep(0.25)
if__name__=="__main__":
L=[]
lock_con=threading.Condition()
threads=[]
foriinrange(5):
threads.append(Producer())
threads.append(Consumer())
fortinthreads:
t.start()
fortinthreads:
t.join()
print('----end----')

运行结果:

生产者Thread-1:Append63[]
生产者Thread-2:Append66[63]
生产者Thread-3:Append20[63,66]
生产者Thread-4:Append83[63,66,20]
生产者Thread-5:Append2[63,66,20,83]
生产者Thread-4:Append26[]
消费者Thread-6:Delete26[26]
生产者Thread-2:Append21[]
生产者Thread-3:Append71[21]
生产者Thread-1:Append19[21,71]
生产者Thread-5:Append100[21,71,19]
生产者Thread-1:Append96[]
消费者Thread-6:Delete96[96]
........
THE END

发表回复