IPC 指的是进程间通讯
之所以开启子进程 ,肯定需要他帮我们完成任务,很多情况下,需要将数据返回给父进程。
然而进程内存是物理隔离的
解决方案:
1.将共享数据放在文件中,就是慢
2.管道 subprocess 中那个管道只能单向通讯,必须有父子关系
3.共享一块内存区域 得操作系统帮你分配,速度快
第三钟实现Manager
from multiprocessing import Process,Manager import time def task(dic): print("子进程") dic["a"] = 1 if __name__ == '__main__': # Manager 继承之间专用的与外界 m = Manager()#开辟专用内存空间 dic = m.dict({})#在这块内存空间生成一个字典 # 生成公共区域的字典 p = Process(target=task,args=(dic,)) p.start() time.sleep(3)#因为进程开启速度较为慢,所以先执行父进程 print(dic["a"])
进程之间的通讯另一种方式 使用queue
queue队列
队列的特点:
先进先出
后进后出
就放扶梯一样
from multiprocessing import Process,Queue def task(queue): for i in range(3): queue.put(i)#将数据放入队列 if __name__ == '__main__': q = Queue() p = Process(target=task,args = (q,)) p.start() print(q.get())#取值规范先进先出 print(q.get()) print(q.get())
同时queue队列中存取值,存在阻塞,也可通过修改参数来使得
from multiprocessing import Process,Queue import time q = Queue(3)#限定管道中可以存放多少属性 q.put("hello",block=False)#当管道已经存满的话,存放是否接受阻塞,True接受阻塞,False不接受阻塞 q.put("world",block=False) q.put("nice",block=False) # q.put("12333",block=False)#放不下的直接异常 queue.Full print(q.get(block= False)) print(q.get(block= False)) print(q.get(block= False)) # print(q.get(block=False))#当管道被被取空的话,是否接受阻塞,True接受阻塞,False不接受阻塞 #异常 _queue.Empty
timeout属性表示愿意等待的时间
# 了解 q = Queue(3) q.put("q",timeout=3) q.put("q2",timeout=3) q.put("q3",timeout=3) # 如果满了 愿意等3秒 如果3秒后还存不进去 就炸 # q.put("q4",timeout=3) print(q.get(timeout=3)) print(q.get(timeout=3)) print(q.get(timeout=3)) # 如果没了 愿意等3秒 如果3秒后还取不到数据 就炸 print(q.get(timeout=3))