python 多线程信号生产者消费者例子

问题:
生产者一次生产完6个后,消费者开始消费,消费完6个后,接着开始生产

条件对象实现:

import threading, time
"""
    生产5个开始消费

"""

count = 0
# 用 Sem
semaphore = threading.Condition()

class Product(threading.Thread):
    def run(self):
        global count
        semaphore.acquire()
        while True:
            if count <= 5:
                count += 1
                time.sleep(2)
                print(f"开始生产:生产1个,现在{count}个")
            else:
                print("生产够了,开始消费")
                semaphore.notify()
                semaphore.wait()
            
            
    

class Consume(threading.Thread):
    def run(self):
        global count
        semaphore.acquire()
        while True:
            if count > 0:
                count -= 1
                time.sleep(2)
                print(f"开始消费:消费1个,现在{count}个")
                
            else:
                print("消费够了,开始生产")
                semaphore.notify()
                semaphore.wait()

信号量对象实现

count = 0
# 用 Sem
semaphore1 = threading.Semaphore(1)
semaphore2 = threading.Semaphore(0)

class Product(threading.Thread):
    def run(self):
        global count
        semaphore1.acquire()
        while True:
            if count <= 5:
                count += 1
                time.sleep(2)
                print(f"开始生产:消费1个,现在{count}个")
            else:
                semaphore2.release()
                print("生产够了,开始消费")
                semaphore1.acquire()
                
                
            
            
    

class Consume(threading.Thread):
    def run(self):
        global count
        semaphore2.acquire()
        while True:
            if count > 0:
                count -= 1
                time.sleep(2)
                print(f"开始消费:消费1个,现在{count}个")
                
            else:
                
                semaphore1.release()
                print("消费够了,开始生产")
                semaphore2.acquire()

时间对象实现

count = 0
# 用 Sem
event1 = threading.Event()
event2 = threading.Event()

class Product(threading.Thread):
    def run(self):
        global count
        while True:
            if count <= 5:
                count += 1
                time.sleep(2)
                print(f"开始生产:生产1个,现在{count}个")
            else:
                
                print("生产够了,开始消费")
                event2.set()
                event1.clear()
                event1.wait()
                
                

class Consume(threading.Thread):
    def run(self):
        global count
        while True:
            event2.wait()
            if count > 0:
                count -= 1
                time.sleep(2)
                print(f"开始消费:消费1个,现在{count}个") 
            else:
                print("消费够了,开始生产")
                event1.set()
                event2.clear()
                event2.wait()

主程序:

product = Product()
product.start()

consume = Consume()
consume.start()
posted @ 2021-04-14 19:41  ShanCe-刘勇  阅读(115)  评论(0编辑  收藏  举报