python - Python TCP 套接字 recv(1) 与 recv(n) 的效率

标签 python sockets tcp

我正在构建一个 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/

相关文章:

javascript - 如何从 JavaScript 网站抓取数据?

python - 翻译模型预测 : TypeError: Object of type 'EagerTensor' is not JSON serializable

使用线程的 Pythonic 方式

c - dtach - 如何检查是否已附加或未附加

c# - 如果使用 TCP 与主机失去连接,则重新连接 - C#

python - 使用python按不同颜色的位置绘制图

Linux 上的 PHP 套接字 - 在通过命令退出 php 之后/当 php 退出时立即释放 tcp 端口?

Java如何等待命令完成?

tcp - Netty 客户端没有收到来自快速服务器的消息

java - JDBC 中的连接是什么?