1

たくさんのことをチェックした後、いくつかのキーについては、python-memcachedが取得できないか、マシンに設定できないことがわかりました(Mac OSX 10.9、自作memcache 1.4.15、pipがインストールされたpython-memcached 1.53) . 私の最初の問題は、何が起こっているのかについて明確な考えを持っていなかった暗闇の中でのショットでしたが、さらに掘り下げた後、私は今間違いなく今です.

それはすべて def _get_server(self, key) にかかっています。

デバッグ出力行を 2 行追加すると、

def _get_server(self, key):
    if isinstance(key, tuple):
        serverhash, key = key
    else:
        serverhash = serverHashFunction(key)

    for i in range(Client._SERVER_RETRIES):
        server = self.buckets[serverhash % len(self.buckets)]
        if server.connect():
            #print "(using server %s)" % server,
            print 'got server {} for {}'.format(serverhash % len(self.buckets),
                                                key)
            return server, key
        print 'server {} failed for {}'.format(serverhash % len(self.buckets),
                                            key)
        serverhash = serverHashFunction(str(serverhash) + str(i))
    return None, None

キー「NFL::CAR_TB」を取得または設定しようとしています。

import memcache
mc_cl = memcache.Client('127.0.0.1')
mc_cl.set('JAC_SF', 1)
mc_cl.get('JAC_SF')
mc_cl.set('UAC_SF', 1)
mc_cl.get('UAC_SF')

結果、私のマシンで、

server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 5 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 5 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for UAC_SF
got server 6 for UAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for UAC_SF
got server 6 for UAC_SF

_get_server を変更すると

def _get_server(self, key):
    choices = range(len(self.buckets) - 1)
    random.shuffle(choices)

    if isinstance(key, tuple):
        choice, key = key
    else:
        choice = choices.pop()

    for _ in range(Client._SERVER_RETRIES):
        server = self.buckets[choice]
        if server.connect():
            #print "(using server %s)" % server,
            print 'got server {} for {}'.format(choice,
                                                key)
            return server, key
        print 'server {} ({}) failed for {}'.format(choice, server, key)
        choice = choices.pop()
    return None, None

その後、すべてがはるかにうまく機能し、

got server 4 for JAC_SF
server 0 (inet:1:11211 (dead until 1384821552)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821552)) failed for JAC_SF
got server 4 for JAC_SF
server 7 (inet:.:11211 (dead until 1384821552)) failed for UAC_SF
server 0 (inet:1:11211 (dead until 1384821552)) failed for UAC_SF
got server 6 for UAC_SF
server 7 (inet:.:11211 (dead until 1384821552)) failed for UAC_SF
server 2 (inet:7:11211 (dead until 1384821552)) failed for UAC_SF
server 5 (inet:.:11211 (dead until 1384821552)) failed for UAC_SF
server 1 (inet:2:11211 (dead until 1384821552)) failed for UAC_SF
got server 6 for UAC_SF
Python プログラムで複数のキーを設定しようとすると、非常に一貫性のない結果が得られました。 ret = mc_cl.set_multi(mapping=mapping, time=TWO_HOURS) getret = mc_cl.get_multi(mapping.keys()) if len(mapping) != len(getret): print 'not set\n\t{}'. format('\n\t'.join([str((k, mapping[k])) for k in [a for a in mapping.keys() if a not in getret.keys()]])) および生のmemcache出力を分析した後、すべてのキーが設定されているわけではなく、その後すべてのキーが要求されているわけではないようです. Mac OSX 10.9 で、homebrew と pip ですべての作業が完了し、最新の状態になっています。以下の Memcache の出力とそれを読み取ると、228 個の項目があったのに対し、101 個のキーのみが書き込みと読み取りが試みられたことが示されています。import re gamesSet = [] gamesGet = [] with open('memout.log') as f: for line in f.read().split('\n'): match = re.match('^21 OK 22 OK 21 保存しました
4

1 に答える 1

0

これは、私が現在 python-memcached ライブラリのライター/メンテナーであるhttps://github.com/linsomniac/python-memcached/issues/21と議論している奇妙なものです。

ランダムに、ここで間違っていたのは最初の行でした。

mc_cl = memcache.Client('127.0.0.1')

クライアントはイテラブルを期待しますが、文字列を取得しないことを確認することを保証しません。そのため、非常に Pythonic な方法で、この文字列をイテラブルとして扱い、'1'、'2' のそれぞれを設定して反復処理します。 、 '7' '。' 「0」はmemcachedサーバーのIPアドレスですが、本当の混乱が始まったのは、「0」が実際には有効なIPアドレスであり、0.0.0.0に評価され、ローカルのmemcachedサーバーによって処理される場合です。あなたはセットアップされています(それが私の開発環境のセットアップ方法です)。

単純に変更すると、

mc_cl = memcache.Client(('127.0.0.1',))

すべてが期待どおりに機能しますが、「127.0.0.1」文字列を渡すと、エラーメッセージも、キーが設定されていない、「取得」できないというレポートも表示されず、非常に不安定で上記のような説明不可能な動作。

于 2013-12-05T17:54:24.653 に答える