Python之进程通信管道,与数据共享

# 进程通信--管道:默认管道是全双工通道
# 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的情况,推荐使用队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值