day39-进程-队列

#队列Queue:进程之间数据是隔离的,不共享的,但是通过multiprocessing的Queue可以实现进程之间的通信。
#1、先进先出:把1 2 3放到队列里,按1 2 3的顺序拿出来。
from multiprocessing import Queue
q = Queue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
# 1
# 2
# 3

#2、当队列没有值时,继续使用print(q.get())会导致进程阻塞:执行代码之后不会出现Process finished with exit code 0
from multiprocessing import Queue
q = Queue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
print(q.get()) #阻塞。

#3、另外一种阻塞的情况是,实例化对象的长度不等于放进的长度:
from multiprocessing import Queue
q = Queue(3)   #对象长度是3,也就是最多有3个元素。当放入多于3个元素,就会阻塞。
q.put(1)
q.put(2)
q.put(3)
q.put(4) #放入第4个元素,阻塞,下面的代码无法运行。
print(q.get())

#4、实现主进程跟子进程之间的通信:主进程可以拿到子进程放入的hello:
from multiprocessing import Queue
from multiprocessing import Process
def q_put(q):
    q.put('hello')

if __name__ == '__main__':
    q = Queue()
    p = Process(target=q_put,args=(q,))
    p.start()
    print(q.get()) #主进程可以拿到子进程放入的hello
#hello

#5、子进程跟子进程之间的通信:
from multiprocessing import Process
from multiprocessing import Queue
def q_put(q):
    q.put('hello')

def q_get(q):  #拿到另外一个子进程放入的hello,实现子进程跟子进程之间的通信。
    print(q.get())

if __name__ == '__main__':
    q = Queue()
    p = Process(target=q_put,args=(q,))
    p.start()
    p1 = Process(target=q_get,args=(q,))
    p1.start()
# hello

#6、生产者和消费者模型:以做包子为例:
from multiprocessing import Queue
from multiprocessing import Process
import time
def producer(q):  #生产者,做包子
    for i in range(100): #因为托盘只能放10个包子,消费者吃一个之后,生产者才生产一个。
        q.put(i)         #多于10的情况下,其他包子都在等待着生产。

def consumer(q):
    for i in range(100):
        time.sleep(1)  #每个消费者一秒吃一个
        print(q.get())

if __name__ == '__main__':
    q = Queue(10)    #托盘只能放10个包子。这样可以让内存存放比较少的数据。
    p = Process(target=producer,args=(q,))
    p.start()
    for i in range(5): #总共5个消费者
        p1 = Process(target=consumer,args=(q,))
        p1.start()

#7、队列是双向通信的(比较少使用):producer put的同时也可以get到consunmer put的数据。consumer get的同时也可以put数据到队列里
#被producer get到。
原文地址:https://www.cnblogs.com/python-daxiong/p/12142737.html