Condition版的生产者和消费者模式
threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作
threading.Condition 实际上是继承threading.Lock
acquire:上锁。
release:解锁。
wait:将当前线程处于等待状态,并且会释放锁。可以被其他线程使用notify和notify_all函数唤醒。被唤醒后会继续等待上锁,上锁后继续执行下面的代码。
notify:通知某个正在等待的线程,默认是第1个等待的线程。
notify_all:通知所有正在等待的线程。notify和notify_all不会释放锁。并且需要在release之前调用。
gLoad = threading.Condition()
'''
Condition版的生产者和消费者模式
''' import threading
import random
import time gMoney = 1000 # 原始金额
gLoad = threading.Condition()
gTime = 0 # 生产次数 class Producer(threading.Thread):
def run(self):
global gMoney
global gTime
while True:
gLoad.acquire()
if gTime < 10:
gTime += 1
money = random.randint(50,500)
gMoney += money
print("生产线程%s生成了%d元,剩余%d元"%(threading.current_thread(),money,gMoney)) else:
gLoad.release()
break
gLoad.notify_all() # 通知所有阻塞的线程,在释放锁之前
gLoad.release()
time.sleep(2) class Consumer(threading.Thread):
def run(self):
global gMoney
global gTime
while True:
gLoad.acquire()
money = random.randint(100,1000)
while money > gMoney:
if gTime == 10:
gLoad.release()
return
print("消费线程%s准备消费了%d元,剩余%d元,不足" % (threading.current_thread(), money, gMoney))
gLoad.wait() # 使进程在阻塞状态,同时释放锁
gMoney -= money
print("消费线程%s消费了%d元,剩余%d元" % (threading.current_thread(), money, gMoney))
gLoad.release()
time.sleep(2) def main():
for x in range(3):
t = Consumer(name="消费者线程%s"%x)
t.start() for x in range(5):
t = Producer(name="生产者线程%s"%x)
t.start() if __name__ == '__main__':
main()