• python 多线程笔记(6)-- 生产者/消费者模式(续)


    用 threading.Event() 也可以实现生产者/消费者模式

    (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!)

    import threading
    import time
    import random
    
    
    products = 20
    
     
    class Producer(threading.Thread):
        '''生产者'''
        ix = [0] # 生产者实例个数
                 # 闭包,必须是数组,不能直接 ix = 0
        
        def __init__(self):
            super().__init__()
            self.ix[0] += 1
            self.setName('生产者' + str(self.ix[0]))
     
        def run(self):
            global producer_signal, products
            
            while True:
                if products < 10:
                    if not producer_signal.is_set(): producer_signal.set()
                    products += 1;
                    print("{}:库存告急。我努力生产了1件产品,现在产品总数量 {}".format(self.getName(), products))
                else:
                    print("{}:库存充足。我努力生产了0件产品,现在产品总数量 {}".format(self.getName(), products))
                    if producer_signal.is_set(): producer_signal.wait()
                time.sleep(random.randrange(1,4))
            
            
    class Consumer(threading.Thread):
        '''消费者'''
        ix = [0] # 消费者实例个数
                 # 闭包,必须是数组,不能直接 ix = 0
                 
        def __init__(self):
            super().__init__()
            self.ix[0] += 1
            self.setName('消费者' + str(self.ix[0]))
     
        def run(self):
            global consumer_signal, products
            
            while True:
                if products > 1:
                    if not consumer_signal.is_set(): consumer_signal.set()
                    products -= 1;
                    print("{}:我消费了1件产品,现在产品数量 {}".format(self.getName(), products))
                else:
                    print("{}:我消费了0件产品。现在产品数量 {}".format(self.getName(), products))
                    if consumer_signal.is_set(): consumer_signal.wait()
                time.sleep(random.randrange(2,6))
     
    
            
            
    if __name__ == "__main__":
    
        producer_signal = threading.Event()
        consumer_signal = threading.Event()
        
        for i in range(2):
            p = Producer()
            p.start()
     
        for i in range(10):
            c = Consumer()
            c.start()
     
  • 相关阅读:
    mysql同步 小问题
    通过 XtraBackup 实现不停机不锁表搭建主从同步
    grep -A -B选项详解和mysqlbinlog
    MySQL存储过程中的3种循环
    mysql利用存储过程批量插入数据
    React routerV4 笔记
    数据结构算法基础定义
    网站性能优化
    去重除了indexOf的其他方法(使用对象Key的方法)及统计重复次数
    立即执行函数的两种写法及闭包
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5178878.html
Copyright © 2020-2023  润新知