Question

J'ai écrit un gevent programme à base qui permet à ses clients Web rapidement échanger des messages à travers elle (il fonctionne comme un hub).

Depuis que je soutiens que le mécanisme de vote à ce moment-là, je l'ai écrit pour stocker les messages qui doivent être livrés à un client spécifique dans sa « boîte de réception » du côté serveur. Alors que la liste des clients est stockée dans MySQL, ces boîtes de réception sont stockés dans memcache pour un accès plus rapide. Lorsqu'un client se connecte au centre, il tire tous les messages qui se sont accumulés dans sa boîte de réception.

La question Le problème est qu'une fois sur un court alors que les destinataires ne reçoivent pas leurs messages en tirant le contenu de leur boîte de réception - ils reçoivent un tableau vide
. Ce qui me déconcerte encore plus est que si je redémarre le centre, les messages qui ne sont pas reçus par les clients se matérialisent soudainement et se livrés à leur destination.
Pouvez-vous me montrer s'il y a un défaut flagrant dans mon code? Avez-vous une explication à cet effet?

push est la méthode qui est exécuté pour placer un message dans la boîte de réception d'un client. pull est la méthode qui récupère la liste de tous les messages accumulés sous forme de liste et le renvoie à la fonction principale de traitement.

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 []
Était-ce utile?

La solution

Je pense que je suis arrivé: il est un bug dans le Python- memcache module.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top