2012-09-14 10 views
6

Membranlanan bir sunucuya bağlanmak için pylibmc module kullanan bir python web uygulaması var. Uygulamamı saniyede bir kez veya daha yavaş isteklerle test edersem, her şey iyi çalışıyor.pylibmc: 'Assertion' ptr-> query_id == query_id +1 "işlev için başarısız" memcached_get_by_key "'

Assertion "ptr-> query_id == query_id 1" fonksiyonu için başarısız için "memcached_get_by_key" büyük olasılıkla: Ben saniyede birden fazla isteği göndermek Ancak, benim app çöker ve benim günlüklerinde aşağıdaki bakın "Programlayıcı hatası, query_id değeri artırılmadı.", Libmemcached/get.cc: 107

"ptr-> query_id == query_id +1" ifadesi, "Programmer hatası, query_id" için "memcached_get_by_key" işlevinde başarısız oldu. artırılmamıştır. ", libmemcached/get.cc: 89

Neyin yanlış gittiğine veya nasıl düzeltileceğine dair bir fikriniz var mı?

Benim kod şöyle görünür:

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

Neden kendi sorunuza bir cevap yazdınız? – grc

+0

@grc Sorunu çözdüğümden? AFAIK [kendi sorunuza cevap vermeniz önerilir] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Yapmamam mı söylüyorsun? Başkalarının onlara sahip olması durumunda başka önerilere açığım ama cevabım benim sorunumu çözdü. Bu sorunun cevabını orijinal olarak aradığımda hiçbirini bulamadım, bu yüzden burada yayınlamanın başkalarına yardım etmesini umuyorum. – culix

cevap

4

Bu parçacığı konudur. pylibmc clients are not thread-safe. Her iş parçacığı için ayrı bir bağlantı sağladığınızdan emin olmak için kodunuzu ThreadMappedPool object kullanın. Böyle bir şey:

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) 

muhtemelen yıkıcı, iplik bittiğinde self.pool.relinquish() aramak emin olun!

(benim web sunucusu olarak cherrypy kullanıyordum çünkü Benim durumumda bu oldu ve cherrypy varsayılan olarak isteklerinize yanıt. 10 ayrı konuları çoğaltılır) Ben Apache üzerinde Django çalıştıran aynı konuda koştu

1

. pylibmc'dan python-memcached'a geçmek benim için problemi ortadan kaldırdı.

+0

Ayrıca, django_elasticache.memcached.ElastiCache arka ucuna bakın. Pylibmc kullanır, ancak GIL ile güzel oynadığı ve çökmediği şekilde onu böyle çağırır. – Cerin

İlgili konular