• 【爬虫】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()
  • 相关阅读:
    hdu1814 Peaceful Commission 2-SAT
    上传下载文件
    文件下载类
    文件操作类
    MD5加密帮助类
    加密解密类
    发送邮件函数
    DataTable 分页
    服务器缓存帮助类
    Cookie帮助类
  • 原文地址:https://www.cnblogs.com/st-st/p/10409077.html
Copyright © 2020-2023  润新知