pylibmc: 'Assertion “ptr->query_id == query_id +1” failed for function “memcached_get_by_key”'

前端 未结 2 2034
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-03 00:11

I have a python web app that uses the pylibmc module to connect to a memcached server. If I test my app with requests once per second or slower, everything works fine. If I

相关标签:
2条回答
  • 2021-01-03 00:49

    This is a threading issue. pylibmc clients are not thread-safe. You should convert your code to use a ThreadMappedPool object to ensure you keep a separate connection for each thread. Something like this:

    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)
    

    Make sure to call self.pool.relinquish() when the thread is finished, possibly in the destructor!

    (In my case this happened because I was using cherrypy as my web server, and cherrypy spawns 10 separate threads to serve requests by default.)

    0 讨论(0)
  • 2021-01-03 00:56

    I ran into the same issue running Django on Apache. Switching from pylibmc to python-memcached eliminated the problem for me.

    0 讨论(0)
提交回复
热议问题