Чтение данных из memcache иногда не удается - PullRequest
2 голосов
/ 11 октября 2010

Я написал программу на основе gevent , которая позволяет своим веб-клиентам быстро обмениваться сообщениями через нее (так что она работает как хаб).

Поскольку я поддерживаю только механизм опросана данный момент я написал его для хранения сообщений, которые необходимо доставить конкретному клиенту, в его «входящие» на стороне сервера.В то время как список клиентов хранится в MySQL, эти входящие папки хранятся в memcache для более быстрого доступа.Когда клиент подключается к концентратору, он извлекает все сообщения, накопленные в его почтовом ящике.

Вопрос
Проблема заключается в том, что однажды получатели неполучают свои сообщения при извлечении содержимого их входного почтового ящика - они получают пустой массив.
Еще больше меня удивляет то, что если я перезапущу концентратор, сообщения, которые не были получены клиентами, внезапно материализуются и доставляются вместа назначения.
Можете ли вы указать мне, есть ли явный дефект в моем коде?У вас есть какое-либо объяснение этому эффекту?

push - это метод, который выполняется для помещения сообщения в почтовый ящик клиента.pull - это метод, который извлекает список всех накопленных сообщений в виде списка и возвращает его в основную функцию обработки.

def __push(self, domain, message, tid=None):
    if tid:
        try:
            messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
        except:
            logging.error("__push memcached failure", exc_info=1)
        if messages:
            messages = fromjson(messages)
            messages.append(message)
            self.mc.set("%s_inbox" % tid.encode('utf8'), tojson(messages))
            print "Pushed to", "%s_inbox" % tid.encode('utf8')


def __pull(self, tid):
    try:
        messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
        if messages:
            self.mc.set("%s_inbox" % tid.encode('utf8'), "[]")
            return fromjson(messages)
        else:
            return []
    except:
        logging.error("__pull failure", exc_info=1)
        return []

1 Ответ

0 голосов
/ 13 октября 2010

Я думаю, что понял: это ошибка в модуле python-memcache.

...