接收通过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可能不适合这项工作?
有关如何改进代码的任何建议,以便我不会丢失那些宝贵的第一个字节吗?