【爬虫】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()
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号