zoukankan      html  css  js  c++  java
  • 【爬虫】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()
  • 相关阅读:
    无阻塞网络
    带宽、线速、吞吐量
    one-to-all及all-to-all网络通信模式
    CLOS网络架构与FATTREE胖树拓扑
    CLOS网络
    IP分片与重组详解
    原 TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系
    多个方面比较电路交换、报文交换和分组交换的主要优缺点
    地址族与数据序列 (转)
    简单网络搭建与测试 mininet
  • 原文地址:https://www.cnblogs.com/st-st/p/10409077.html
Copyright © 2011-2022 走看看