zoukankan      html  css  js  c++  java
  • 并发编程---队列---生产者消费者模型

    队列

    队列:底层就是以管道和锁定的方式实现

    目的: 多个进程之间通信使用的,一个进程将数据放到队列里面,另外一个进程从队列里面取走数据,干的是进程之间通信的活

    队列的大小:是使用内存的大小

    from multiprocessing import Queue
    q = Queue(3)
    
    q.put('hello')
    q.put({'a':1})
    q.put([3,3,3])
    print(q.full()) # 查看队列是否满了
    
    print(q.get())
    print(q.get())
    print(q.get())
    q.empty() # 清空队列的数据
    print(q.full())
    
    '''
    打印结果:
    True
    hello
    {'a': 1}
    [3, 3, 3]
    False
    '''
    队列

    生产者消费者模型

    生产者指的是生产数据的任务,消费者指的是处理数据的任务

    生产者消费者的模型:生产者《==》队列《===》消费者

    好处:程序解开耦合,生产者与消费者不直接通信,平衡了生产者与消费者的速度差

    from multiprocessing import Process,Queue
    import time
    
    def producer(q):
        for i in range(3):
            res = '包子%s' %i
            time.sleep(0.5)
            print('生产者生产了%s' %res)
    
            q.put(res)
        # q.put(None) # 不能在这写的原因:因为含有多个生产者,生产者1生产结束后发送信号,这时其他生产者还可能没有生产完,消费者在取的时候,碰到生产者1就结束了。
    
    def consumer(q):
        while True:
            res = q.get()
            if res is None:break
            time.sleep(1)
            print('消费者吃了%s' %res)
    
    if __name__ == '__main__':
        #容器
        q = Queue()
    
        #生产者们
        p1 = Process(target=producer,args=(q,))
        p2 = Process(target=producer,args=(q,))
        p3 = Process(target=producer,args=(q,))
    
        #消费者们
        c1 = Process(target=consumer,args=(q,))
        c2 = Process(target=consumer,args=(q,))
    
        p1.start()
        p2.start()
        p3.start()
        c1.start()
        c2.start()
    
        p1.join() # 保证了p1这个进程执行完了
        p2.join()
        p3.join()
        q.put(None)
        q.put(None)
        print('')
    '''
    打印结果:
    生产者生产了包子0
    生产者生产了包子0
    生产者生产了包子0
    生产者生产了包子1
    生产者生产了包子1
    生产者生产了包子1
    消费者吃了包子0
    生产者生产了包子2
    消费者吃了包子0
    生产者生产了包子2
    生产者生产了包子2
    主
    消费者吃了包子0
    消费者吃了包子1
    消费者吃了包子1
    消费者吃了包子1
    消费者吃了包子2
    消费者吃了包子2
    消费者吃了包子2
    '''
    View Code

    JoinableQueue

    from multiprocessing import Process,JoinableQueue
    import time
    
    def producer(q):
        for i in range(2):
            res = '包子%s' %i
            time.sleep(0.5)
            print('生产者生产了%s' %res)
            q.put(res)
        q.join()  # 等队列执行完
    
    def consumer(q):
        while True:
            res = q.get()
            if res is None:break
            time.sleep(1)
            print('消费者吃了%s' %res)
            q.task_done() # 可以告诉生产者,已经有一个数据被取走
    
    if __name__ == '__main__':
        #容器
        q = JoinableQueue()
    
        #生产者们
        p1 = Process(target=producer,args=(q,))
        p2 = Process(target=producer,args=(q,))
        p3 = Process(target=producer,args=(q,))
    
        #消费者们
        c1 = Process(target=consumer,args=(q,))
        c2 = Process(target=consumer,args=(q,))
        c1.daemon = True
        c2.daemon = True
    
        p1.start()
        p2.start()
        p3.start()
        c1.start()
        c2.start()
    
        p1.join()
        p2.join()
        p3.join()
        print('')
    '''
    打印结果:
    生产者生产了包子0
    生产者生产了包子0
    生产者生产了包子0
    生产者生产了包子1
    生产者生产了包子1
    生产者生产了包子1
    消费者吃了包子0
    消费者吃了包子0
    消费者吃了包子0
    消费者吃了包子1
    消费者吃了包子1
    消费者吃了包子1
    主
    '''
    View Code
  • 相关阅读:
    Hbuilder连接第3方模拟器(夜神)
    localStorage H5本地存储
    各种经典教程的收集分享
    laravel学习教程整理
    js-打地鼠游戏开发
    我的文件备份
    jQuery Ajax 简单的实现跨域请求
    HTML如何编写为桌面程序
    js调用打印机
    js base64加密解密
  • 原文地址:https://www.cnblogs.com/Mryang123/p/8894159.html
Copyright © 2011-2022 走看看