2012-09-14 12 views
6

Mam aplikację internetową Pythona, która używa pylibmc module do łączenia się z memcached serwera. Jeśli testuję aplikację z żądaniami raz na sekundę lub wolniej, wszystko działa poprawnie. Jeśli mogę wysłać więcej niż jeden wniosek na sekundę, jednak moi awarii aplikacji i widzę następujące w moich dziennikach:pylibmc: "Asercja" ptr-> query_id == query_id +1 "nie powiodło się dla funkcji" memcached_get_by_key "'

assertion „ptr-> query_id == query_id +1” nie powiodło się dla funkcji „memcached_get_by_key” prawdopodobne "Błąd programisty, parametr query_id nie był inkrementowany.", W libmemcached/get.cc: 107

Asercja "ptr-> query_id == query_id +1" nie powiodła się dla funkcji "memcached_get_by_key" prawdopodobnie dla "Błąd programisty, query_id nie był inkrementowany. ", w libmemcached/get.cc: 89

Każdy pomysł, co się dzieje źle lub jak to naprawić?

Mój kod wygląda następująco:

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

Dlaczego natychmiast zamieściłeś odpowiedź na swoje pytanie? – grc

+0

@grc Ponieważ rozwiązałem problem? AFAIK [odpowiadając na własne pytanie jest zachęcany] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Mówisz, że nie powinienem? Jestem otwarty na inne sugestie, jeśli inne osoby je mają, ale moja odpowiedź rozwiązała mój problem. Kiedy początkowo szukałem odpowiedzi na ten problem, nie znalazłem żadnego, więc mam nadzieję, że umieszczenie go tutaj pomoże innym, którzy do niego trafią. – culix

Odpowiedz

4

Jest to kwestia gwintowania. pylibmc clients are not thread-safe. Powinieneś przekonwertować swój kod na wersję ThreadMappedPool object, aby zapewnić oddzielne połączenie dla każdego wątku. Coś takiego:

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) 

Upewnij się, aby zadzwonić self.pool.relinquish() gdy wątek jest gotowy, ewentualnie w destructor!

(w moim przypadku tak się stało, bo używałem cherrypy jak mój serwer WWW, a CherryPy ikra 10 osobne wątki służyć żądań domyślnie.)

1

Pobiegłem do tego samego problemu z systemem Django na Apache. Przejście z pylibmc na python-memcached wyeliminowało problem dla mnie.

+0

Zobacz także obsługę plików django_elasticache.memcached.ElastiCache. Używa pylibmc, ale wywołuje go w taki sposób, aby ładnie grał z GIL i nie ulega awarii. – Cerin

Powiązane problemy