(8)进程---Queue队列

 

# IPC Inter-Process Communication

# 实现进程之间通信的两种机制:

# 管道 Pipe 用的很少

# 队列 Queue

队列的特征:现进先出,栈属于后进后出

基本语法:from multiprocessing import Queue

q = Queue(3) 传参数表示只允许放入3个数,不是长度,是个数

q.get() 取不到的时候会有阻塞,不会报异常,程序挂起

q.put() 存入超出范围也不会报异常

q.getnowait() 拿不到报异常

q.put_nowait() 非阻塞版本的put ,放入超出范围也会报异常

q.empty() 检测是否为空 (了解) 在一边存一边取得时候判断不准确

q.full() 检测是否已经存满 (了解) 在一边存一边取得时候判断不准确

生产者和消费者模型:

生产者和消费者模型从程序上来讲就是数据的存入和获取的过程

最为理想的生产者和消费者模型 , 两者之间的运行速度应该是同步的

from multiprocessing import Process,Queue
import time
import random
# 消费者方法 [负责取值]
def consumer(q,name):
    while True:
        food = q.get()
        if food is None:
            break
        time.sleep(random.uniform(0.5,1))
        print("%s吃了一个%s" % (name,food))

# 生产者方法 [负责存值]
def producer(q,name,food):
    for i in range(5):
        time.sleep(random.uniform(0.3,0.8))
        print("%s生产了%s" % (name,food))
        q.put(food+str(i))


if __name__ == "__main__":
    q = Queue()
    c1 = Process(target=consumer,args=(q,"陈露中"))
    c2 = Process(target=consumer,args=(q,"陈根基"))
    # c1.daemon = True
    c1.start()
    c2.start()
    p1 = Process(target=producer,args=(q,"订海呀","地瓜"))
    p2 = Process(target=producer,args=(q,"陈红平","黄瓜"))
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()
    q.put(None) # 添加None,让程序自动结束
    q.put(None)
View Code

 执行结果:

订海呀生产了地瓜
陈红平生产了黄瓜
订海呀生产了地瓜
陈红平生产了黄瓜
陈根基吃了一个黄瓜0
订海呀生产了地瓜
陈露中吃了一个地瓜0
陈红平生产了黄瓜
订海呀生产了地瓜
陈根基吃了一个地瓜1
陈露中吃了一个黄瓜1
陈红平生产了黄瓜
陈红平生产了黄瓜
陈根基吃了一个地瓜2
订海呀生产了地瓜
陈露中吃了一个黄瓜2
陈根基吃了一个地瓜3
陈露中吃了一个黄瓜3
陈根基吃了一个黄瓜4
陈露中吃了一个地瓜4
View Code

 

原文地址:https://www.cnblogs.com/lyj910313/p/10787256.html