2012-09-14 9 views
6

Tengo una aplicación web de Python que usa pylibmc module para conectarse a un servidor memcached. Si pruebo mi aplicación con solicitudes una vez por segundo o más lento, todo funciona bien. Si envío más de una solicitud por segundo, sin embargo, mis aplicación se bloquea y veo lo siguiente en los registros de mi:pylibmc: 'Afirmación' ptr-> query_id == query_id +1 "error de la función" memcached_get_by_key "'

aserción "ptr-> query_id == query_id 1" no para la función "memcached_get_by_key" probable para "Error del programador, el query_id no se incrementó", en libmemcached/get.cc: 107

Aserción "ptr-> query_id == query_id +1" error de la función "memcached_get_by_key" likely for "Error del programador, query_id no se incrementó. ", en libmemcached/get.cc: 89

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

Mi código es el siguiente:

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

¿Por qué publicaste inmediatamente una respuesta a tu pregunta? – grc

+0

@grc ¿Porque he resuelto el problema? AFAIK [se recomienda contestar a su propia pregunta] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). ¿Estás diciendo que no debería? Estoy abierto a otras sugerencias si otras personas las tienen, pero mi respuesta resolvió mi problema. Cuando originalmente busqué las respuestas a este problema, no encontré ninguna, así que espero que su publicación aquí ayude a otros que se topan con ella. – culix

Respuesta

4

Este es un tema de roscado. pylibmc clients are not thread-safe. Debe convertir su código para usar un ThreadMappedPool object para asegurarse 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úrese de llamar self.pool.relinquish() cuando se termina el hilo, posiblemente en el destructor!

(En mi caso esto sucedió porque estaba usando cherrypy que mi servidor web, y cherrypy desova 10 hilos separados para servir peticiones por defecto.)

1

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

+0

Además, consulte el backend django_elasticache.memcached.ElastiCache. Utiliza pylibmc, pero lo llama de una manera tal que funciona bien con GIL y no se cuelga. – Cerin

Cuestiones relacionadas