我有一堆數據通過套接字連接進入,對於我的應用程序,我只關心最近的數據。消息是JSON格式的文本字符串,由換行符分隔。我想弄清楚的是隻讀最新消息的乾淨而有效的方式。消息每隔30ms左右進入一次。我的問題之一是在我的代碼加載之前開始的消息,所以可能會有很多無用的消息,我不希望它通過。如何在Python/Jython中只讀取套接字中的最新數據和/或清空套接字
有什麼建議嗎?
我使用jython,它非常類似於python,除了一些不方便不起作用的東西,但它對套接字來說沒問題。
的是我迄今爲止嘗試過的代碼片段:
# ...
# This code is repeatedly called every 30 ms or so
in_file = sock_in.makefile('r')
data_in = None
try:
data_in = json.loads(in_file.readline())
except JSONDecodeError:
try:
data_in = json.loads(in_file.readline())
except JSONDecodeError:
print("ERROR: malformed message, dropping data")
return
# do stuff with data_in
# ...
這基本上是從套接字中,如果發生搶缺少一些消息的一大塊,它會再試一次抓起下一個(到目前爲止每次都有效)。 我的問題是,如果消息傳入太快(它們是),它似乎是先讀取較舊的消息,而只有最新的消息纔有用。 這種方法似乎工作正常,但我有一種感覺可能會好很多。
我想另一件事是這樣的:
# ...
self.buf = ""
# ... This code is repeatedly called every 30ms or so
self.read_socket(self.sock_in)
data_in = json.loads(self.odom_str)
# ...
def read_socket(self, sock):
out = self.buf
while True:
try:
data = sock.recv(64)
except:
return False
if not data:
break
nl = data.find('\n')
if nl >= 0:
nl += 1
out += data[:nl]
self.buf = data[nl:]
del data
break
out += data
self.odom_str = out
return True
這第二種方法看起來更好,但執行差很多。
有沒有辦法在成功讀取後清空套接字文件?或從它的最後讀取一個簡單的方法?或者,這實際上是從最後閱讀,我感到困惑? 我是使用套接字的新手,很多我一直在嘗試的東西可能都是可怕的風格,所以任何幫助都將不勝感激:)
謝謝!