创建大型消息处理程序查找表是否不正确



我有一个队列,我正在向它推送消息。消息有一个唯一的整数ID。我基本上有这样的东西:

#-------------------------
#Message handlers
#-------------------------
def noOperation():
    print "Do nothing"
def msgHandler1():
    print "Handling message with ID = 1"
def msgHandler2():
    print "Handling message with ID = 2"
#-------------------------
#Message lookup table
#-------------------------
lookupTable = {
    0: noOperation,
    1: msgHandler1,
    2: msgHandler2
    #...etc...
}
#-------------------------
#Message processing
#-------------------------
while threadActive:
    message = buffer.get(block=True)
    if message:
        lookupTable[message.id]()

我的问题是:有没有更有效的方法来做这类事情?如果我有几十种消息类型(或者,为了论证起见,假设消息类型的数量是无限的,并且会随着时间的推移继续增长),那么我的查找表会变得很大。也许这真的不是问题——我不确定。。。创建这样一个映射到数十个消息处理程序方法的大表,感觉有点不对。这类事情是一个众所周知的问题,有一个定义明确的解决方案吗?这上面有什么图案吗?

我认为你的方式是最好的方式。最接近的设计模式是命令模式。这或多或少就是您在python中实现它的方式。我并不担心你的查询表会太大。我将在您的代码中建议的唯一更改是以下

if message.id in lookupTable:
    lookupTable[message.id]()
else:
    print "invalid id"

这样就可以处理else 中的默认情况

如果您的ID是连续的,那么最好使用一个可以直接访问的简单列表。这样就不用查字典了。

lookupTable = [
    noOperation,        # index 0
    msgHandler1,        # index 1
    msgHandler2         # index 2 etc
    ]
while threadActive:
    message = buffer.get(block=True)
    if message:
        try:
            lookupTable[message.id]()
        except IndexError:
            print 'unknown id {}'.format(message.id)

在Python中,最好尝试使用索引并捕获异常,而不是首先测试它是否有效。这将导致更快的代码。此外,不要使用in,因为这将对数组进行线性搜索。

相关内容

  • 没有找到相关文章

最新更新