【问题标题】:python asyncore not keeping up with high data ratespython asyncore 跟不上高数据速率
【发布时间】:2013-08-18 09:12:34
【问题描述】:

我在 Linux 中有一个简单的 Asyncore 客户端,它与在 Windows 机器上用 C 开发的服务器交互。

该设置非常适合每秒写入 asyncore 缓冲区的数据速率,但只要我的数据速率超过该数据速率(我已测试每 0.1 秒一次),Asyncore 就不会发送所有写入。一些缓冲区值会丢失,并且永远不会到达服务器。

我怀疑这是因为 asyncore 经历了一个循环,并且只检查缓冲区中是否有数据在每个循环中发送一次,如果数据速率高于循环时间,那么它们就会丢失。这是真的?如果是这样,是否有解决此问题的方法或 Asyncore 以外的其他套接字模块不会造成此问题?

这是我正在使用的代码:

class DETClient(asyncore.dispatcher):

    buffer = ""
    t = None

    def __init__(self, host, port):

        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((host,port))
        self.host=host
        self.port=port
        self.t = ReceiverBoard(self)
        self.t.start()

    def initiate_connection_with_server(self):
        print("trying to initialize connection with server...")
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((self.host,self.port))

    def sendCommand(self, command):
        self.buffer = command +'\0'

    def handle_connect(self):
        pass

    def handle_error(self):
        print("problem reaching server.")
        self.initiate_connection_with_server()

    def handle_close(self):
        self.t.stop()
        self.close()

    def handle_read(self):
        message = str(self.recv(20)) #how many bytes should be read?

        if (message=="b'system_bias_ON'"):
            self.t.enable_sys_bias()

        if (message=="b'system_bias_OFF'"):
            self.t.disable_sys_bias()

        if (message[2:5]=="DET"):
            self.t.DET_bias_command_received = True
            self.t.DET_bias_command_text = message

        if (message[2:7]=="CURVE"):
            self.t.DET_bias_command_received = True
            self.t.DET_bias_command_text = message

    def handle_write(self):
        sent=self.send(self.buffer.encode())
        self.buffer=""

【问题讨论】:

  • 您应该添加一个答案并接受它,而不是在问题的末尾添加答案(是的,接受您自己的答案是合法的。)
  • 感谢您的提示。我无法立即发布答案,因为我必须等待至少八小时才能回答我自己的问题。

标签: python asyncore


【解决方案1】:

我找到了这个问题的答案。在这种情况下,Asyncore 不应该受到责备。问题中提供的代码正在错误地使用缓冲区接口。我所要做的就是将 handle_write 方法中的最后一行替换为以下行:

self.buffer = self.buffer[发送:]

这样就解决了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多