zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    windows运行shell脚本
    Android Webview H5资源本地化
    Vscode开发Python环境安装
    Vscode开发Java环境搭建
    为什么索引可以提高效率?
    Java内存模型
    栈和队列----向有序的环形单链表中插入新节点
    栈和队列----单链表的选择排序
    栈和队列----将搜索二叉树转换成双向链表
    栈和队列----在单链表中删除指定值的节点
  • 原文地址:https://www.cnblogs.com/ShanCe/p/14659582.html
Copyright © 2011-2022 走看看