# 进程通信--管道:默认管道是全双工通道 # from multiprocessing import Process # from multiprocessing import Pipe # # def func(conn1,conn2): # conn1.close() # while True: # try: # ret = conn2.recv() # print(ret) # except EOFError: # conn2.close() # break # if __name__ == '__main__': # # 实例化管道得到管道的两端 # conn1,conn2 = Pipe() # # 管道的两端均可以send和recv,分别是conn1.send用conn2.recv,conn2.send和conn1.recv # # 管道两端均要传给子进程,以便于关闭不需要的端 # p = Process(target=func,args=(conn1,conn2)) # # 不用的管道不能在进程start之前关闭,否则报错 # # conn2.close() # OSError: handle is closed # p.start() # # conn2.close() # conn2在此处可关可不关闭 # for i in range(10): # conn1.send(i) # # 发送端发送完数据要关闭管道的发送端 # conn1.close() # 使用管道建立一个生产者消费者模型 # from multiprocessing import Process # from multiprocessing import Pipe # import time,random # # def producer(pro,con): # con.close() # for i in range(10): # time.sleep(random.random()) # print("发送了message%d"%(i)) # pro.send(i) # pro.close() # # def consumer(pro,con): # pro.close() # while True: # time.sleep(random.random()) # try: # ret = con.recv() # print("接收了message%d"%(ret)) # except EOFError: # con.close() # break # # if __name__ == '__main__': # pro,con = Pipe() # p = Process(target=producer,args=(pro,con)) # p.start() # c = Process(target=consumer,args=(pro,con)) # c.start() # pro.close() # con.close() # 接收端在此处可关闭可不关闭 # 使用管道建立一个生产者多消费者模型 # from multiprocessing import Process # from multiprocessing import Pipe # import time,random # # def producer(pro,con,name): # con.close() # for i in range(10): # time.sleep(random.random()) # print("%s发送了message%d"%(name,i)) # pro.send(i) # pro.close() # # def consumer(pro,con,name): # pro.close() # while True: # time.sleep(random.random()) # try: # ret = con.recv() # print("%s接收了message%d"%(name,ret)) # except EOFError: # con.close() # break # # if __name__ == '__main__': # pro,con = Pipe() # p = Process(target=producer,args=(pro,con,'生产者')) # p.start() # c = Process(target=consumer,args=(pro,con,'消费者1')) # c.start() # c1 = Process(target=consumer,args=(pro,con,'消费者2')) # c1.start() # c2 = Process(target=consumer,args=(pro,con,'消费者3')) # c2.start() # pro.close() # con.close() # 接收端在此处可关闭可不关闭 # 但是管道不是数据安全的,多消费者情况下会发生数据安全问题,推荐使用管道 # 进程间内存共享 # from multiprocessing import Process # from multiprocessing import Manager # # def func(dic): # dic['k'] -= 1 # if __name__ == '__main__': # m = Manager() # dic = m.dict({"k":50}) # print(dic) # p_lst = [] # for i in range(50): # p = Process(target=func,args=(dic,)) # p.start() # p_lst.append(p) # for p in p_lst:p.join() # print(dic['k']) # 内存共享是数据不安全,以上例子容易出现减50次后值不为0的情况,推荐使用队列
Python之进程通信管道,与数据共享
最新推荐文章于 2024-04-25 19:10:58 发布