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

时间:2012-09-14 07:32:09

标签: python memcached cherrypy

我有一个python web应用程序,它使用pylibmc module连接到memcached服务器。如果我每秒一次或更慢地测试我的应用程序请求,一切正常。但是,如果我每秒发送多个请求,我的应用程序崩溃了,我在日志中看到以下内容:

  

断言“ptr-> query_id == query_id +1”函数“memcached_get_by_key”失败,可能是“程序员错误,query_id没有递增。”,libmemcached / get.cc:107

     

断言“ptr-> query_id == query_id +1”函数“memcached_get_by_key”失败,可能是“程序员错误,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)

2 个答案:

答案 0 :(得分:4)

这是一个线程问题。 pylibmc clients are not thread-safe。您应该将代码转换为使用ThreadMappedPool object以确保为每个线程保持单独的连接。像这样:

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作为我的网络服务器,并且cherrypy默认生成10个单独的线程来处理请求。)

答案 1 :(得分:1)

我遇到了在Apache上运行Django的同样问题。从pylibmc切换到python-memcached消除了我的问题。