从memcache读取数据有时会失败

时间:2010-10-11 08:17:21

标签: python memcached heisenbug gevent

我编写了一个基于 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 []

1 个答案:

答案 0 :(得分:0)

我想我明白了:它是python-memcache模块中的bug