首先,如果你有控制目標API,我會建議實現每個消息的回覆。每發送一條消息的回覆ACK(確認)都會使您的API更加健壯,並完全迴避這個問題。
如果這不是一種選擇,那麼我會針對不同類型的消息創建類:
class Message(object):
def __init__(self, msg):
self.msg = msg
class MessageWReply(Message):
await_reply = True
class MessageNoReply(Message):
await_reply = False
創建所有的消息類的,然後用它們像這樣:
def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))
if message.await_reply:
data = s.recv(1024)
print(data)
或者,如果您不想要創建所有類的開銷,則可以使用字典將消息映射到正確的操作:
messages = {
'message with reply 1': True, # wait for reply
'message with reply 2': True,
'message with reply 2': True,
'message without reply 1': False, # don't wait for reply
'message without reply 2': False
}
則執行以下操作:
def send_message(self, message, host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, self.PORT))
s.send(bytes(message, 'ascii'))
if messages[message]:
data = s.recv(1024)
print(data)
第二種方法具有清潔器初始化(以下樣板代碼),但是有點不太清楚。對於不熟悉代碼的人來說,目前尚不清楚存儲在messages[message]
處的值實際上是什麼意思,而message.await_reply
很清晰。類似named tuples可能是一個很好的折衷方案 - 您可以初始化一個數據結構中的所有內容,同時仍然使用已命名的字段進行清晰。
可能取決於您的操作系統,但是'select'模塊可能適合您? – thebjorn