首先,如果你有控制目标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