Python Pipe 进程间通信

模拟场景:
多个STS-1数据流的复用过程在SONET中扮演了非常重要的角色,这些STS-1数据流称为支流(tributary )。一个3:1复用器将三个输入STS-1支流复用到一个STS-3输出STS-3流中。复用过程是按字节进行的,也就是说,前三个输出字节分别是支流1、2和3的第一个字节;接下去的三个字节分别是支流1、2和3的第二个字节;以此类推。请编写一个程序来模拟这样的3:1复用器。你的程序应该包含5个进程。主进程创建4个进程,其中三个进程分别对应于三个STS-1支流,另一个对应于复用器。每个支流进程从一个输入文件中读入810字节作为一个STS-1帧,它们将这些帧(逐个字节)发送给多路复用器进程。复用器进程接收这些字节,然后(逐个字节地)输出一个STS-3帧(将该帧写到标准输出设备上)。进程之间的通信请使用管道。

简单代码实现:

from multiprocessing import Process, Pipe

FRAME_SIZE = 810

class Tributary(Process):
    def __init__(self):
        Process.__init__(self)

    def dowork(self, conn, filename):
        f = open(filename, 'r')
        size = 0
        data = f.read()
        while size < FRAME_SIZE:
            conn.send(data[8*size:8*(size+1)])
            size += 1
        f.close()
        conn.close()

class Multiplexer(Process):
    def __init__(self):
        Process.__init__(self)

    def dowork(self, conn):
        size = 0
        buffer = []
        while size < FRAME_SIZE:
            for i in range(3):
                buffer.append(conn[i].recv())
            size += 1
        for i in range(3):
            conn[i].close()
        data = ''.join(buffer)
        print(data)

if __name__ == "__main__":
    (conn_1, conn1) = Pipe(duplex=False)
    (conn_2, conn2) = Pipe(duplex=False)
    (conn_3, conn3) = Pipe(duplex=False)

    p = []
    for i in range(3):
        p.append(Tributary()) 
    p.append(Multiplexer())

    p[0].dowork(conn1, "1.txt")
    p[1].dowork(conn2, "2.txt")
    p[2].dowork(conn3, "3.txt")
    p[3].dowork((conn_1, conn_2, conn_3))

    for i in range(4):
        p[i].start()
    for i in range(4):
        p[i].join()

题目来源:《计算机网络(第3版)》第二章课后习题No.59

推荐阅读更多精彩内容