【问题标题】:pylibmc: 'Assertion "ptr->query_id == query_id +1" failed for function "memcached_get_by_key"'pylibmc:“函数“memcached_get_by_key”的断言“ptr->query_id == query_id +1”失败”
【发布时间】:2012-09-07 08:27:24
【问题描述】:

我有一个使用pylibmc module 连接到memcached 服务器的python 网络应用程序。如果我每秒使用请求一次或更慢的速度测试我的应用程序,则一切正常。但是,如果我每秒发送一个以上的请求,我的应用程序就会崩溃,并且我会在日志中看到以下内容:

函数“memcached_get_by_key”的断言“ptr->query_id == query_id +1”失败,可能是“程序员错误,query_id 未递增。”,位于 libmemcached/get.cc:107

函数“memcached_get_by_key”的断言“ptr->query_id == query_id +1”失败,可能是因为“程序员错误,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)

【问题讨论】:

  • 为什么你会立即发布自己问题的答案?
  • @grc 因为我解决了这个问题? AFAIK answering your own question is encouraged。你是说我不应该吗?如果其他人有其他建议,我愿意接受,但我的回答解决了我的问题。当我最初搜索这个问题的答案时,我没有找到,所以我希望在这里发布它可以帮助其他遇到它的人。

标签: python memcached cherrypy


【解决方案1】:

这是一个线程问题。 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 作为我的 Web 服务器,并且默认情况下,cherrypy 会生成 10 个单独的线程来处理请求。)

【讨论】:

    【解决方案2】:

    我在 Apache 上运行 Django 时遇到了同样的问题。从pylibmc 切换到python-memcached 解决了我的问题。

    【讨论】:

    • 另外,请参阅 django_elasticache.memcached.ElastiCache 后端。它使用 pylibmc,但以这样的方式调用它,因此它可以很好地与 GIL 配合使用并且不会崩溃。
    猜你喜欢
    • 2023-03-29
    • 2014-12-17
    • 1970-01-01
    • 2020-08-19
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多