pylibmc: ‘Afirmación “ptr-> query_id == query_id +1” falló para la función “memcached_get_by_key”‘

Tengo una aplicación web de Python que usa el módulo pylibmc para conectarme a un servidor memcached. Si pruebo mi aplicación con solicitudes una vez por segundo o más lenta, todo funciona bien. Sin embargo, si envío más de una solicitud por segundo, mi aplicación se bloquea y veo lo siguiente en mis registros:

La afirmación “ptr-> query_id == query_id +1” falló para la función “memcached_get_by_key” probablemente para “Error del progtwigdor, el query_id no se incrementó.”, En libmemcached / get.cc: 107

La afirmación “ptr-> query_id == query_id +1” falló para la función “memcached_get_by_key” probablemente para “Error del progtwigdor, el query_id no se incrementó.”, En libmemcached / get.cc: 89

¿Alguna idea de qué está mal o cómo solucionarlo?

Mi código se ve así:

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) 

Este es un tema de hilos. Los clientes pylibmc no son seguros para subprocesos . Debes convertir tu código para usar un objeto ThreadMappedPool para asegurarte de mantener una conexión separada para cada hilo. Algo como esto:

 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) 

Asegúrate de llamar a self.pool.relinquish() cuando el hilo haya finalizado, posiblemente en el destructor.

(En mi caso, esto sucedió porque estaba usando cherrypy como mi servidor web, y cherrypy genera 10 subprocesos separados para atender las solicitudes de forma predeterminada).

Me encontré con el mismo problema ejecutando Django en Apache. Cambiar de pylibmc a python-memcached eliminó el problema para mí.