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()
 

 

posted @ 2016-02-03 02:59  罗兵  阅读(867)  评论(0编辑  收藏  举报