Frage

habe ich geschrieben, um ein GEVENT -basierten Programm, das schnell zu tauschen Nachrichten durch sie ihr Web-Clients ermöglicht (so wie ein Hub funktioniert).

Da ich nur Polling-Mechanismus in diesem Moment unterstützen, ich habe es geschrieben Nachrichten zu speichern, dass Bedarf in seinem ‚Posteingang‘ auf der Serverseite an einen bestimmten Client geliefert werden. Während der Client-Liste in MySQL gespeichert wird, werden diese Postfächer in memcache für einen schnelleren Zugriff gespeichert. Wenn ein Client eine Verbindung zu der Nabe, zieht er alle Nachrichten, die in ihrem Posteingang angesammelt haben.

Die Frage
Das Problem ist, dass einmal auf kurze Zeit die Empfänger nicht ihre Mitteilungen empfangen, wenn der Inhalt ihrer Posteingang ziehen - sie ein leeres Array erhalten
. Was mir ein Rätsel noch mehr ist, dass wenn ich den Hub neu zu starten, die Nachrichten, die von den Kunden nicht empfangen wurden materialisieren werden plötzlich und an ihren Bestimmungsort geliefert bekommen.
Können Sie mir zeigen, wenn eine eklatante Fehler in meinem Code ist da? Haben Sie eine Erklärung für diesen Effekt?

push ist die Methode, eine Nachricht zu platzieren in einem Client-Posteingang ausgeführt wird. pull ist die Methode, ruft die Liste aller akkumulierten Nachrichten als Liste und gibt sie an die Hauptverarbeitungsfunktion.

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 []
War es hilfreich?

Lösung

Ich glaube, ich habe es: es ist ein Bug in der Python- memcache Modul.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top