'''
两条进程通过管道共享数据
'''
import multiprocessing

import time

# 发送数据
def sendData(conn):
    for i in range(5):
        conn.send("good afternoon")
        time.sleep(1)

    # 发送完毕关闭管道
    conn.close()
    pass


# 接收数据
def recvData(conn):
    mlist = []
    while True:
        try:
            # 当管道已关闭时,recv()可能抛出OSError异常,
            data = conn.recv()# 阻塞接收
            print(data)

            mlist.append(data)
            if len(mlist) > 3:
                conn.close()

        # 如果管道已关闭,
        except OSError:
            print("该死的管道已关闭")
            pass

    # 接收完毕关闭管道
    conn.close()

    pass

# 单向管道示例
def pipeDemo():
    # 创建一个单向传输的管道,其返回值是tupe,第0项为接收方Connection对象,第1项为发送方Connection对象
    pipe = multiprocessing.Pipe(duplex=False)
    # Connection().close()
    # 让发送进程持有pipe[1],接收进程持有pipe[0]
    multiprocessing.Process(target=sendData, args=(pipe[1],)).start()
    multiprocessing.Process(target=recvData, args=(pipe[0],)).start()

def work1(conn):
    for i in range(5):
        # 连发两条信息
        conn.send("来自甲方的问候-%d"%(i))
        conn.send("来自甲方对全家的问候-%d" % (i))

        # 接收对方发来的两条信息
        print("甲方:收到问候{1}{0}".format(conn.recv(),conn.recv()))#format({0},{1},{2}...)
        time.sleep(1)

    # 关闭传输管道
    conn.close()
    pass

def work2(conn):
    for i in range(5):
        conn.send("来自乙方的问候-%d"%(i))
        conn.send("来自乙方对全家的问候-%d"%(i))
        print("乙方:收到问候{1}{0}".format(conn.recv(),conn.recv()))
        time.sleep(1)
    conn.close()
    pass

# 全双工管道示例
def duplexPipeDemo():
    # 创建一个全双工传输的管道,其返回值是tupe,内含两个Connection对象,都可以收发
    pipe = multiprocessing.Pipe(duplex=True)
    # 将两端的Connection对象分别传递给两个进程,双方都可以收发
    multiprocessing.Process(target=work1, args=(pipe[0],)).start()
    multiprocessing.Process(target=work2, args=(pipe[1],)).start()


if __name__ == "__main__":

    # pipeDemo()

    duplexPipeDemo()

    print("main over")

results matching ""

    No results matching ""