Python程序中的进程操作-进程间通信(multiprocess.Queue)
Python程序中的进程操作-进程间通信(multiprocess.Queue)一、进程间通信? IPC(Intal-Process Communication) 二、队列2.1 multiprocess.Queue创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue是实现多进程之间的数据传递。
参数:maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。 底层队列使用管道和锁定实现。
from multiprocessing import Queue q = Queue(5) # 括号可以传参数 表示的是这个队列的最大存储数 # 往队列中添加数据 q.put(1) q.put(2) q.put(3) # print(q.full()) # 判断队列是否满了 q.put(4) q.put(5) # print(q.full()) # q.put(6) # 当队列满了之后,再放入数据 不会报错 会原地等待 直到队列中有数据被取走(阻塞态) print(q.get()) print(q.get()) print(q.get()) # print(q.empty()) # 判断队列中的数据是否取完 print(q.get()) print(q.get()) # print(q.empty()) print(q.get_nowait()) # 取值 没有值不等待直接报错 # print(q.get()) # 当队列中的数据被取完之后 再次获取 程序会阻塞 知道有人往队列中放入值 full,get_nowait,empty都不使用于多进程的情况。 小结Queue(5) # 括号可以传参数 表示的是这个队列的最大存储数 q.put(1) # 往队列中添加数据 q.full() # 判断队列是否满了 q.put(6) # 当队列满了之后,再放入数据 不会报错 会原地等待 直到队列中有数据被取走(阻塞态) q.get() # 从队列取值 只要有值就取 q.empty() # 判断队列中的数据是否取完 q.get_nowait() # 取值 没有值不等待直接报错 q.get() # 当队列中的数据被取完之后 再次获取 程序会阻塞 知道有人往队列中放入值 进程间通信子进程放数据 主进程获取数据,两个子进程相互放 取数据 from multiprocessing import Process,Queue def producer(q): q.put("hello GF~") # 往通道发值 def consumer(q): print(q.get()) # 从通道取值 if __name__ == '__main__': q = Queue() # 通道的作用 p = Process(target=producer,args=(q,)) # 产生子进程p c = Process(target=consumer,)) # 产生子进程c p.start() c.start() # hello GF~ 生产者消费者模型生产者:生产/制造数据的 消费者:消费/处理数据的 例子:做包子的,买包子的 1.做包子远比买包子的多 2.做包子的远比包子的少 供需不平衡的问题 from multiprocessing import Process,Queue,JoinableQueue import random import time def producer(name,food,q): for i in range(10): data = f"{name}生产了{food}{i}" time.sleep(random.random()) q.put(data) print(data) def consumer(name,q): while True: data = q.get() if data == None:break print(f"{name}吃了{data}") time.sleep(random.random()) q.task_done() # 告诉队列你已经从队列中取出了一个数据 并且处理完毕了 if __name__ == '__main__': q = JoinableQueue() p = Process(target=producer,args=("大厨egon","馒头",q)) p1 = Process(target=producer,args=("跟班tank",'生蚝',q)) c = Process(target=consumer,args=('nick',q)) c1 = Process(target=consumer,args=("吃货jerry",q)) p.start() p1.start() # 下面的意思是要确保所有生产者的产生东西已经完全生产出来 c.daemon = True # 守护c进程 主进程代码运行结束,守护进程随即终止。 c1.daemon = True # 守护c进程 主进程代码运行结束,守护进程随即终止。 c.start() c1.start() # 这两句的代码意思是要确定每一个消费者已经吃完了通道中的食物才结束。 p.join() # 主进程等待子进程的结束 p1.join() # 主进程等待子进程的结束 q.join() # 等到队列中数据全部取出 # q.put(None) # q.put(None) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |