题
我写了一个 GEVENT- 基于基于网络客户端的程序可以快速通过它交换消息(因此它像集线器一样工作)。
由于我目前仅支持投票机制,因此我将其写信为存储需要在服务器端的“收件箱”中传递给特定客户端的消息。当客户端列表存储在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 []
解决方案
我想我明白了:这是 漏洞 在Python-Memcache模块中。
不隶属于 StackOverflow