我想通过命名管道发送数据块,并希望接收器知道数据块的结束位置.我应该如何使用命名管道?我应该使用某种格式来连接和拆分块(将管道总是作为字节流处理)还是有其他方法?
我已尝试在发送器处为每个数据块打开和关闭管道,但数据在接收器端连接(EOF不发送):
for _ in range(2):
with open('myfifo', 'bw') as f:
f.write(b'+')
结果:
rsk@fe temp $cat myfifo
++rsk@fe temp $
解决方法:
您可以在管道上使用某种分隔符或框架结构,或者(最好)使用多处理.像对象一样管道并通过它们运行Pickled Python对象.
第一个选项是简单地定义一个将通过管道运行的简单协议.为您发送的每个数据块添加标题,以便您知道如何处理它.例如,使用长度值系统:
import struct
def send_data(file_descriptor, data):
length = struct.pack('>L', len(data))
packet = "%s%s" % (length, data)
file_descriptor.write(packet)
def read_data(file_descriptor):
binary_length = file_descriptor.read(4)
length = struct.unpack('>L', binary_length)[0]
data = ''
while len(data) < length:
data += file_descriptor.read(length - len(data))
至于另一个选项 – 您可以尝试读取多处理模块的代码,但实际上,您只需通过管道运行cPickle.dumps的结果,然后将其读入cPickle.loads以获取Python对象.