[b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe

# -*- coding: utf-8 -*-
"""
多进程数据共享 管道Pipe

逻辑:
    2个进程,各自发送数据到管道,对方从管道中取到数据

总结:
    1、只适合两个进程
    2、recv 会阻塞
    3、其中一个进程结束了,管道还在,另外一个进程还能使用
    4、可以把管道认为一个队列, 发送数据端,往队列写数据
                                接收数据端,从队列读数据,队列空了阻塞
       单向管道 1个队列,双向管道 2个队列

使用:
    1. 创建2个管道的两端的对象  pipe_left_conn,pipe_right_conn = Pipe()
    2. 在两个进程中 分布 调用 收发命令  conn.send(messsage) con.recv()

参考:
    Pipe对象返回的元组分别代表管道的两端,管道默认是全双工,两端都支持send和recv方法,
    两个进程分别操作管道两端时不会有冲突,两个进程对管道一端同时读写时可能会有冲突:
"""

from multiprocessing import Process,Pipe

# 子进程函数
def f(conn):
    conn.send("child send1")
    conn.send([2,'test',None])
    print(conn.recv())
    conn.close()

if __name__ == "__main__":
    # 产生两个返回对象,一个是管道这一头,一个是另一头

    # 创建管道,拿到两端对象
    # 默认True,双向管道都能收发
    # Pipe(False)单向管道  左边只接收,右边只发送
    pipe_left_conn,pipe_right_conn = Pipe()

    p = Process(target=f,args=(pipe_right_conn,))
    p.start()

    print(pipe_left_conn.recv())

    pipe_left_conn.send('\nfather send')

    p.join()

    # 注意,子进程已经结束了,但是管理里的数据还在
    print(pipe_left_conn.recv())

    # print(parent_conn.recv()) # 此时管道空了,会阻塞

    pipe_left_conn.close()
    pipe_right_conn.close()


"""
Out:

child send1

father send
[2, 'test', None]
"""

 

posted @ 2018-09-12 17:04  sunzebo  阅读(346)  评论(0编辑  收藏  举报