cul*_*lix 6 python memcached cherrypy
我有一个python web应用程序,它使用pylibmc模块连接到memcached服务器.如果我每秒一次或更慢地测试我的应用程序请求,一切正常.但是,如果我每秒发送多个请求,我的应用程序崩溃了,我在日志中看到以下内容:
断言"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)
Run Code Online (Sandbox Code Playgroud)
这是一个线程问题。pylibmc 客户端不是线程安全的。您应该将代码转换为使用ThreadMappedPool 对象,以确保为每个线程保留单独的连接。像这样的东西:
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)
Run Code Online (Sandbox Code Playgroud)
确保self.pool.relinquish()在线程完成时调用,可能在析构函数中调用!
(在我的例子中,发生这种情况是因为我使用cherrypy作为我的Web服务器,并且cherrypy默认生成10个单独的线程来服务请求。)
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |