进程间的通讯————IPC
""" IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放到文件中 就是慢 2.管道 subprocess中的那个 管道只能单向通讯 必须存在父子关系 3.共享一块内存区域 得操作系统帮你分配 速度快 """ from multiprocessing import Process,Manager import time def 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)) #引发错误行
结果: q q2 q3 Traceback (most recent call last): File "F:/oldboy课程记录/day36/代码/6.进程间通讯2.py", line 59, in <module> print(q.get(timeout=3)) File "F:\Python\lib\multiprocessing\queues.py", line 105, in get raise Empty queue.Empty