我想通过命名管道发送数据 block ,并希望接收方知道数据 block 在哪里结束。我应该如何使用命名管道呢?我应该使用某种格式来连接和拆分块(始终将管道视为字节流)还是有任何其他方法?
我已经尝试在每个数据 block 的发送端打开和关闭管道,但数据在接收端连接起来(EOF 未发送):
for _ in range(2):
with open('myfifo', 'bw') as f:
f.write(b'+')
结果:
rsk@fe temp $ cat myfifo
++rsk@fe temp $
最佳答案
您可以在管道上使用某种分隔符或框架结构,或者(最好)像对象一样使用 multiprocessing.Pipe
并通过它们运行 Pickled Python 对象。
第一个选项只是定义一个简单的协议(protocol),您将在您的管道中运行该协议(protocol)。为您发送的每个数据 block 添加一个 header ,以便您知道如何处理它。例如,使用长度值系统:
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))
至于其他选项 - 您可以尝试阅读 multiprocessing
模块的代码,但本质上,您只是通过管道运行 cPickle.dumps
的结果,并且然后将其读入 cPickle.loads
以获取 Python 对象。
关于python - 在 Linux 中通过命名管道发送数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20719819/