我正在构建一个TCP应用程序,它使用换行符\n
来分隔未知长度的消息(但通常是<64字节)。我发现this article非常有用。
一次是recv
一个字符的最佳(即最有效/最快)方法,并检查它是换行符还是recv
更大的缓冲区并在类中存储“剩余”? / p>
一次一个
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]
答案 0 :(得分:1)
获得大块块肯定更有效率,因为你的操作更少。想想这样:如果你有一条长度为1000的消息,那么你的循环将在第一种情况下发射1000次而在第二种情况下仅发射16次。性能损失是显而易见的。当然这是因为Python,但即使在操作系统级别它也更有效率,因为同样的原因:制作1000个sys调用instad 16和扫描字符串(顺便说一下:你应该扫描chunk
而不是{长度为64的{1}}比对message
的64次调用便宜。这就是它。