Skip to main content
 首页 » 编程设计

python之从内存缓存中读取数据有时会失败

2025年05月04日11shanyou

我编写了一个基于 gevent 的程序,允许其 Web 客户端通过它快速交换消息(因此它像一个集线器一样工作)。

由于目前我只支持轮询机制,所以我将其编写为在服务器端的“收件箱”中存储需要传递给特定客户端的消息。虽然客户端列表存储在 MySQL 中,但这些收件箱存储在内存缓存中以便更快地访问。当客户端连接到集线器时,它会提取收件箱中累积的所有消息。

问题
问题是,从前收件人在拉取收件箱内容时收不到他们的消息 - 他们收到一个空数组。
更让我困惑的是,如果我重新启动集线器,客户端没有收到的消息会突然出现并被传送到他们的目的地。
如果我的代码中有明显的缺陷,你能指出我吗?您对此有何解释?

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 [] 

请您参考如下方法:

我想我明白了:它是一个 bug在 python-memcache 模块中。