pylibmc:“针对函数“ memcached_get_by_key”的断言“ ptr-> query_id == query_id +1”失败”

发布于 2021-01-29 16:15:39

我有一个使用pylibmc模块连接到内存缓存服务器的python网络应用程序。如果我每秒对请求进行一次或更慢的测试,则一切正常。但是,如果我每秒发送多个请求,则我的应用程序崩溃,并且我在日志中看到以下内容:

函数“ memcached_get_by_key”的声明“ ptr-> query_id == query_id
+1”失败,可能是因为“程序员错误,query_id没有增加。”,位于libmemcached / get.cc:107

函数“ memcached_get_by_key”的声明“ ptr-> query_id == query_id
+1”失败,可能是因为“程序员错误,query_id没有增加。”,位于libmemcached / get.cc:89

知道发生了什么问题或如何解决吗?

我的代码如下所示:

self.mc = pylibmc.Client(
    servers=[os.environ.get(MEMCACHE_SERVER_VAR)],
    username=os.environ.get(MEMCACHE_USER_VAR),
    password=os.environ.get(MEMCACHE_PASS_VAR),
    binary=True
    )

#...

if (self.mc != None):
    self.mc.set(key, stored_data)

#...

page = self.mc.get(key)
关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是一个线程问题。pylibmc客户端不是线程安全的。您应该将代码转换为使用ThreadMappedPool对象,以确保为每个线程保留单独的连接。像这样:

    mc = pylibmc.Client(
        servers=[os.environ.get(MEMCACHE_SERVER_VAR)],
        username=os.environ.get(MEMCACHE_USER_VAR),
        password=os.environ.get(MEMCACHE_PASS_VAR),
        binary=True
        )
    self.pool = pylibmc.ThreadMappedPool(mc)
    
    #...
    
    if (self.pool != None):
        with self.pool.reserve() as mc:
            mc.set(key, stored_data)
    
    #...
    
    if (self.pool != None):
        with self.pool.reserve() as mc:
            page = mc.get(key)
    

    确保self.pool.relinquish()在线程完成时调用,可能在析构函数中调用!

    (在我的情况下,发生这种情况是因为我使用cherrypy作为Web服务器,并且默认情况下cherrypy产生了10个单独的线程来处理请求。)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看