python-多进程编程(五)-- 管道

管道也是一种进程间互相通信的方法,它和队列相比,它是队列的底层实现方法,因此在平常的应用中也比队列更加少见,但是理解它对进程间的通信有很大的帮助

简单例子

from multiprocessing import Pipe

conn1,conn2 = Pipe()
conn1.send('123456')
print(conn2.recv())

其实管道的基本使用非常简单,就是一个管道的类实例化之后会生成两个实例对象,就类似于管道的两个端点,从一头发出的消息会被另一端接收到。

可以看到和tcp传递消息很相似,而管道和tcp都是留用socket套接字来传递消息,区别在于一个是网络套接字,一个是本地文件套接字。

关于阻塞

由于当管道开启之后,会一直堵塞进程用于接收消息,即使没有消息发送之后也会一直等待,因此我们需要判断后手动管理管道两端

from multiprocessing import Pipe,Process

def func1(conn1,conn2):
    conn2.close()
    while True:
        try:
            msg = conn1.recv()
            print(msg)
        except EOFError: #当只有一端管道关闭的时候,会抛出EOFError异常
            conn1.close()


if __name__ == '__main__':
    conn1,conn2 = Pipe()
    p1 = Process(target=func1,args=(conn1,conn2))
    p1.start()
    conn1.close()
    for i in range(10):
        conn2.send("在干嘛")
    conn2.close()

pipe的数据不安全性

当有多个进程来从管道中取消息的时候,会有可能多个进程抢占同一个数据,因此管道消费的时候存在数据的不安全性,所以我们在每一个子进程中就要实现一个进程锁,只有拿到锁的人才可以从管道中取得数据。

而队列是数据安全的原因也在于此,它在底层添加了锁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值