python recv丢失数据的第一个字节

时间:2017-02-24 09:19:29

标签: python multithreading optimization

接收通过ssl套接字发送的消息时遇到问题。在极少数情况下,我会丢失消息中前几个字节的数据。我很确定这是一个速度问题,因为它似乎只是在快速连续发送2条消息(相隔1-2毫秒)时发生。我在一个单独的线程中运行接收代码,最小的代码在消息到达时将消息转储到队列中。

queue = Queue()
...

def read_feed(session_key, hostname, port, ssl_socket):

''' READ whatever is coming on the stream '''
while (1):
    try:
        output = ssl_socket.recv(2048) # Message size always < 2048
    except (ConnectionResetError, OSError):
        logger.info("Connecting feed")
        try:
            ssl_socket.connect((hostname, port))
        except ValueError: # Something's wrong, disconnect and do a new round
            ssl_socket.close()
        else:
            cmd = {"cmd":"login", "args":{"session_key":session_key}}
            data = str.encode(json.dumps(cmd) + "\n")
            num_bytes = ssl_socket.send(data)
    else:
        queue.put(output)
...

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_socket = ssl.wrap_socket(s)
...

t3 = threading.Thread(target=read_feed, name = 'Read Feed', args=(session_key, hostname, port, ssl_socket))
t3.start()

我首先怀疑运行的其他线程以某种方式窃取了太多CPU时间,以便在此线程有机会运行之前填充网络缓冲区,但我尝试使用多核机器并且问题仍然存在。

在本质上,这应该是我连接时唯一运行的代码吗?

while (1):
    output = ssl_socket.recv(2048) # Message size always < 2048
    queue.put(output)

或者我在这里做出错误的假设?也许try:/ except:构造成本很高,或者queue.put方法很慢,我应该使用别的东西?或者Python可能不适合这项工作?

有关如何改进代码的任何建议,以便我不会丢失那些宝贵的第一个字节吗?

0 个答案:

没有答案