gpt4 book ai didi

python - 在 Linux 中通过命名管道发送数据 block

转载 作者:可可西里 更新时间:2023-11-01 11:49:21 25 4
gpt4 key购买 nike

我想通过命名管道发送数据 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com