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í.