我编写了一个基于gevent的程序,它允许其 Web 客户端通过它快速交换消息(因此它就像一个集线器一样工作)。
由于我目前只支持轮询机制,所以我编写了它来将需要传递给特定客户端的消息存储在服务器端的“收件箱”中。虽然客户端列表存储在 MySQL 中,但这些收件箱存储在 memcache 中以便更快地访问。当客户端连接到集线器时,它会提取其收件箱中累积的所有消息。
问题
问题是,收件人在提取收件箱的内容时没有收到他们的消息——他们收到一个空数组。
更让我困惑的是,如果我重新启动集线器,客户端未收到的消息将突然实体化并传递到它们的目的地。
如果我的代码有明显的缺陷,你能指出我吗?你对这种效果有什么解释吗?
push
是执行以将消息放入客户端收件箱的方法。pull
是将所有累积消息的列表作为列表检索并返回给主处理函数的方法。
def __push(self, domain, message, tid=None):
if tid:
try:
messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
except:
logging.error("__push memcached failure", exc_info=1)
if messages:
messages = fromjson(messages)
messages.append(message)
self.mc.set("%s_inbox" % tid.encode('utf8'), tojson(messages))
print "Pushed to", "%s_inbox" % tid.encode('utf8')
def __pull(self, tid):
try:
messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
if messages:
self.mc.set("%s_inbox" % tid.encode('utf8'), "[]")
return fromjson(messages)
else:
return []
except:
logging.error("__pull failure", exc_info=1)
return []