【爬虫】Condition版的生产者和消费者模式
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()