我正在构建一个 TCP 应用程序,它使用换行符 \n
来分隔未知长度(但通常小于 64 字节)的消息。我正在寻找 this article非常有用。
是一次recv
一个字符并检查它是否为换行符或recv
更大缓冲区并存储“剩余字符”的最佳(即最有效/最快)方法"在类里面?
一次一个
def __recv_until_newline(self):
message = ""
while True:
chunk = self.socket.recv(1)
if chunk == "" or chunk == "\n":
break
message += chunk
return message
保持缓冲区
def __recv_until_newline(self):
""" self.__buffer holds previously received message parts"""
message = self.__buffer
while True:
chunk = self.socket.recv(64)
message += chunk
if chunk == "" or "\n" in message:
break
# something a bit more intelligent than this in reality, but you get the idea
messages = message.split('\n')
self.__buffer = "".join([x for x in message[1:]])
return messages[0]
最佳答案
获取大块肯定更有效,因为您进行的操作更少。这样想:如果您有一条长度为 1000 的消息,那么您的循环将在第一种情况下触发 1000 次,在第二种情况下仅触发 16 次。性能损失是显而易见的。当然这是因为 Python,但即使在操作系统级别,它也更有效,原因相同:进行 1000 次 sys 调用而不是 16 次。并扫描字符串(顺便说一句:你应该扫描 chunk
而不是 message
) 的长度为 64 比对 recv
的 64 次调用更便宜。差不多就是这样。
关于python - Python TCP 套接字 recv(1) 与 recv(n) 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17501488/