""" IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放到文件中 就是慢 2.管道 subprocess中的那个 管道只能单向通讯 必须存在父子关系 3.共享一块内存区域 得操作系统帮你分配 速度快"""from multiprocessing import Process,Managerimport timedef task(dic): print("子进程xxxxx") # li[0] = 1 # print(li[0]) dic["name"] = "xx"if __name__ == '__main__': m = Manager() # li = m.list([100]) dic = m.dict({}) # 开启子进程 p = Process(target=task,args=(dic,)) p.start() time.sleep(3) print(dic)
结果:子进程xxxxx{ 'name': 'xx'}
""" 进程间通讯的另一种方式 使用queue queue 队列 队列的特点: 先进的先出 后进后出 就像扶梯"""from multiprocessing import Process,Queue# 基础操作 必须要掌握的# 创建一个队列# q = Queue()# # 存入数据# q.put("hello")# q.put(["1","2","3"])# q.put(1)# # 取出数据# print(q.get())# print(q.get())# print(q.get())# print(q.get())# 阻塞操作 必须掌握# q = Queue(3)# # # 存入数据# q.put("hello",block=False)# q.put(["1","2","3"],block=False)# q.put(1,block=False)# # 当容量满的时候 再执行put 默认会阻塞直到执行力了get为止# # 如果修改block=False 直接报错 因为没地方放了# # q.put({},block=False)## # # # 取出数据# print(q.get(block=False))# print(q.get(block=False))# print(q.get(block=False))# # 对于get 当队列中中没有数据时默认是阻塞的 直达执行了put# # 如果修改block=False 直接报错 因为没数据可取了# print(q.get(block=False))# 了解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)) #引发错误行
结果:qq2q3Traceback (most recent call last): File "F:/oldboy课程记录/day36/代码/6.进程间通讯2.py", line 59, inprint(q.get(timeout=3)) File "F:\Python\lib\multiprocessing\queues.py", line 105, in get raise Emptyqueue.Empty