2012-09-14 5 views
6

मेरे पास एक पाइथन वेब ऐप है जो एक मेमकैड सर्वर से कनेक्ट करने के लिए pylibmc module का उपयोग करता है। यदि मैं प्रति सेकंड या धीमे अनुरोधों के साथ अपने ऐप का परीक्षण करता हूं, तो सब कुछ ठीक काम करता है।pylibmc: 'Assertion "ptr-> query_id == query_id +1" फ़ंक्शन के लिए विफल "memcached_get_by_key"

अभिकथन "ptr-> query_id == query_id +1" के समारोह के लिए विफल "memcached_get_by_key" के लिए होने की संभावना: यदि मैं प्रति सेकंड एक से अधिक अनुरोध भेजने के लिए, तथापि, मेरी ऐप्लिकेशन क्रैश और मैं अपने लॉग में निम्न देखें "प्रोग्रामर त्रुटि, query_id वृद्धि नहीं था।", libmemcached/get.cc पर: 107

अभिकथन "ptr-> query_id == query_id +1" के समारोह के लिए विफल "memcached_get_by_key" संभावना "प्रोग्रामर त्रुटि के लिए, query_id libmemcached/get.cc: 89

कोई विचार क्या गलत हो रहा है या इसे कैसे ठीक किया जाए?

मेरे कोड इस तरह दिखता है:

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

आपने तुरंत अपने प्रश्न का उत्तर क्यों पोस्ट किया? – grc

+0

@grc क्योंकि मैंने इस मुद्दे को हल किया है? AFAIK [अपने स्वयं के प्रश्न का उत्तर देने के लिए प्रोत्साहित किया जाता है] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)। क्या आप कह रहे हैं कि मुझे नहीं करना चाहिए? यदि अन्य लोगों के पास है तो मैं अन्य सुझावों के लिए खुला हूं, लेकिन मेरे जवाब ने मेरी समस्या हल की। जब मैंने मूल रूप से इस समस्या के उत्तर की खोज की तो मुझे कोई नहीं मिला, इसलिए मुझे उम्मीद है कि इसे पोस्ट करने से दूसरों को इसमें भाग लेने में मदद मिलती है। – culix

उत्तर

4

यह एक सूत्रण मुद्दा है। pylibmc clients are not thread-safe। यह सुनिश्चित करने के लिए कि आप प्रत्येक थ्रेड के लिए एक अलग कनेक्शन रखें, आपको ThreadMappedPool object का उपयोग करने के लिए अपना कोड परिवर्तित करना चाहिए। कुछ इस तरह:

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) 

self.pool.relinquish() कॉल करने के लिए जब धागा समाप्त हो गया है, संभवतः नाशक में सुनिश्चित करें!

(मेरे मामले में यह हुआ क्योंकि मैं अपने वेब सर्वर के रूप में cherrypy उपयोग कर रहा था, और cherrypy 10 अलग धागे spawns डिफ़ॉल्ट रूप से अनुरोध का उत्तर देने के लिए।)

1

मैं अपाचे पर Django चल ही समस्या का सामना किया। pylibmc से python-memcached पर स्विचिंग ने मेरे लिए समस्या को समाप्त कर दिया।

+0

इसके अलावा, django_elasticache.memcached.ElastiCache बैकएंड देखें। यह pylibmc का उपयोग करता है, लेकिन इसे इस तरह से कॉल करता है ताकि यह जीआईएल के साथ अच्छी तरह से खेल सके और क्रैश न हो। – Cerin

संबंधित मुद्दे