#队列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到。
day39-进程-队列
猜你喜欢
转载自www.cnblogs.com/python-daxiong/p/12142737.html
今日推荐
周排行