模拟场景:
多个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