gpt4 book ai didi

python - 如何有效地从socket.recv()中解包数据?

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:39 28 4
gpt4 key购买 nike

我希望通过在Python中的套接字接收调用进行优化,方法是在调用它之后指定接收大小。我收到一个 6 字节 header (前 4 个为空白,后 2 个为大端)。我的想法是,我通过解包前 6 个字节来获取所需消息的大小,然后使用生成的整数值,将接收缓冲区设置为该特定值,读取套接字并将结果立即添加到我的列表中。这是我的代码片段:

engine_messages = []
try:
while True:
size_header = struct.unpack('!4cH', self.iosocket.recv(6))[4]
socket_payload = self.iosocket.recv(size_header)
engine_messages.append(socket_payload)
except struct.error:
print 'we received 0 bytes; end of stream'
finally:
self.iosocket.close()

问题是当我进行测试运行时,它返回随机结果。有时,我会得到包含 10 项的列表,有时是 100 项,有时是预期值。当我将接收缓冲区设置为 4096 时,我总是收到正确数量的回复。但这样做时,我必须 "".join() 我的列表并执行昂贵的字符串切片来获取我的行。现在,这对于数百/数千的结果集来说并不是什么大问题。问题是,当我处理数十万或数百万条记录的“连接”列表(其中每行大约有 2500 多个字符)时,处理时间开始攀升。

通过直接从流中填充列表,它会增加套接字调用,但不会增加太多,并且总体上会大大节省我的时间。任何想法将不胜感激。

在 Python 2.7.8/Mac 和 2.7.8/Linux 上运行

最佳答案

这里的问题是您假设 socket.recv() call 总是读取作为参数给出的字节数。事实上,它可能会读取更少 - 操作系统网络堆栈缓冲区中等待您的应用程序使用的任何可用内容。这有效地破坏了流中协议(protocol)消息的对齐。

您需要相应地检查从套接字调用返回的大小以及应用程序级别的缓冲区。

注意:您没有指定,但我假设这里是 TCP,因为异常处理 block 中提到了“流”。

关于python - 如何有效地从socket.recv()中解包数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448735/

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