zoukankan      html  css  js  c++  java
  • python实现生产者消费者模型

    生产者消费之模型就是,比如一个包子铺,中的顾客吃包子,和厨师做包子,
    不可能是将包子一块做出来,在给顾客吃,但是单线程只能这麽做,
    所以用多线程来执行,厨师一边做包子,顾客一边吃包子,
    当顾客少时,厨师做的包子就放在一个容器中,等着顾客来吃,
    当顾客多的时候,就从容器中先取出来给顾客吃,厨师继续做包子
    用队列来模拟这个容器

    1
    # 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
    import threading, time, queue
    q = queue.Queue()
    def Produce(name):
        count = 0   #   conut表示做的包子总个数
        while count < 10:
            print('厨师%s在做包子中...'%name)
            time.sleep(2)
            q.put(count)   # 容器中添加包子
      # 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
            print('produce%s已经做好了第%s个包子'%(name, count))
            count += 1
            print('oking...')
    def Consumer(name):
        count = 0    #  count表示包子被吃的总个数
        while count < 10:
            time.sleep(2)  #  排队去取包子,
            if not q.empty():   # 如果存在
                data = q.get() #  取包子, 吃包子
                print('33[32;1mConsumer %s已经把第%s个包子吃了...33[0m' %(name, data))
            else:
                print('包子被吃完了...')
            count += 1
    if __name__ == '__main__':
        p1 = threading.Thread(target=Produce, args=('A君',))
        c1 = threading.Thread(target=Consumer, args=('B君',))
        c2 = threading.Thread(target=Consumer, args=('C君',))
        c3 = threading.Thread(target=Consumer, args=('D君',))
        p1.start()
        c1.start()
        c2.start()
        c3.start()


    2这里就是 当顾客吃完了然后给生产者发送一个信号
    当生产者就接收到信号时,继续做包子
    import threading, time, queue
    q = queue.Queue()
    
    def Produce(name):
        count = 0   #   conut表示做的包子总个数
        while count < 10:
            print('厨师%s在做包子中...'%name)
            time.sleep(2)
            q.put(count)   # 容器中添加包子
            print('produce%s已经做好了第%s个包子'%(name, count))
            count += 1
    
            # q.task_done()  #   当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
            q.join()  #等待接收信号,
            print('ok...')
    def Consumer(name):
        count = 0  # count表示包子被吃的总个数
        while count < 10:
            time.sleep(2)
            # print('waiting...')
            # q.join()
            data = q.get()  # 取包子, 吃包子
            print('%seating...'%name)
            time.sleep(4)   #   吃包子用了4s然后给厨师发送一个信号
            q.task_done()
    
            print('33[32;1mConsumer %s已经把第%s个包子吃了...33[0m' % (name, data))
            # print('包子被吃完了...')
            count += 1
    if __name__ == '__main__':
        p1 = threading.Thread(target=Produce, args=('A君',))
        c1 = threading.Thread(target=Consumer, args=('B君',))
        c2 = threading.Thread(target=Consumer, args=('C君',))
        c3 = threading.Thread(target=Consumer, args=('D君',))
        p1.start()
        c1.start()
        c2.start()
        c3.start()
    #利用同步对象也可以
    event = threading.Event()
    def Produce(name):
        count = 0   #   conut表示做的包子总个数
        while count < 10:
            print('厨师%s在做包子中...'%name)
            time.sleep(2)
            q.put(count)   # 容器中添加包子
            print('produce%s已经做好了第%s个包子'%(name, count))
            event.set()  # 等待接收信号,
            count += 1
    
    def Consumer(name):
        count = 0  
        while count < 10:
            # time.sleep(2)
            event.wait()
            data = q.get()  # 取包子, 吃包子
            print('%seating...'%name)
            time.sleep(2)   #   吃包子用了2s然后给厨师发送一个信号
            print('33[32;1mConsumer %s已经把第%s个包子吃了...33[0m' % (name, data))
            event.clear()
            count += 1
    利用同步对象event模拟信号
  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/xiaokang01/p/9096475.html
Copyright © 2011-2022 走看看