并发编程---队列---生产者消费者模型

队列

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

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

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

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
原文地址:https://www.cnblogs.com/Mryang123/p/8894159.html