python-memcached не может получить или установить 'JAC_SF'

После проверки всего множества вещей, я обнаружил, что для некоторых ключей python-memcached просто не получит или не установит их на моем компьютере (Mac OSX 10.9, доморощенный memcache 1.4.15, pip установленный python-memcached 1.53), Моим первым выпуском был выстрел в темноте, не имеющий четкого представления о том, что происходит, но после более тщательного изучения я теперь определенно сейчас.

Все зависит от def _get_server(self, key):

Если мы добавим две строки распечатки отладки,

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, импортировать memcache TWO_HOURS = 2 * 60 * 60 mc_cl = memcache.Client('127.0.0.1') mapping = {...} mc_cl.flush_all() ret = mc_cl.set_multi(mapping=mapping, time=TWO_HOURS) getret = mc_cl.get_multi(mapping.keys()), если len(mapping)!= len(getret): вывести 'not set\n\t{}'. формат ('\n\t'.join([str((k, mapping[k])) для k в [a для a в mapping.keys (), если a не в getret.keys()]])) и после анализа необработанного вывода memcache кажется, что не все ключи устанавливаются, и не все ключи запрашиваются после этого. Все сделано и актуально на домашнем пиве и в пипсах, на Mac OSX 10.9. Вывод Memcache ниже и его чтение гласит, что только 101 ключ пытался записать и прочитать, тогда как было 228 пунктов. import re gamesSet = [] gamesGet = [] с открытым ('memout.log') как f: для строки в f.read().split('\n'): match = re.match('^21 OK 22 ОК 21 СОХРАНЕН

1 ответ

Это странный вопрос, который я сейчас обсуждаю с автором / сопровождающим библиотеки python-memcached, https://github.com/linsomniac/python-memcached/issues/21.

Случайно, то, что здесь было не так, было самой первой строкой,

mc_cl = memcache.Client('127.0.0.1')

Клиент ожидает итерацию, но не гарантирует, что он не получит строку, поэтому очень питонически он обрабатывает эту строку как итеративную и перебирает ее, устанавливая каждый из '1', '2', '7' '.' и '0' - это IP-адрес сервера memcached, но в действительности возникла путаница, что '0' на самом деле является действительным IP-адресом и оценивается как 0.0.0.0 и обслуживается вашим локальным сервером memcached, если это так вы настроены (так была настроена моя среда разработки).

Если вы просто измените его на

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

Все работает точно так, как ожидалось, но если вы передадите строку "127.0.0.1", вы не получите ни сообщения об ошибках, ни сообщений о неустановленных ключах, ни о том, что их можно "получить", просто очень ошибочно и не объяснимое поведение, как указано выше.

Другие вопросы по тегам