Domanda

Ho scritto un gevent programma basato su che permette ai propri clienti di Internet per scambiare messaggi in modo rapido attraverso di essa (in modo che funziona come un hub).

Dato che io sostengo solo meccanismo di polling in questo momento, ho scritto che per memorizzare i messaggi che devono essere consegnati a un client specifico nella sua 'Posta in arrivo' sul lato server. Mentre la lista di clienti è memorizzato in MySQL, queste caselle di posta vengono memorizzati in memcache per un accesso più rapido. Quando un client si connette al mozzo, si tira tutti i messaggi che si sono accumulate nella sua casella di posta elettronica.

La domanda
Il problema è che una volta su un breve periodo i destinatari non ricevono i loro messaggi quando si tira il contenuto della loro casella di posta - ricevono un array vuoto
. Quello che mi lascia perplesso ancora di più è che se rimetto in moto l'hub, i messaggi che non sono stati ricevuti dai clienti improvvisamente materializzano e vengano consegnati alle loro destinazioni.
Mi può indicare se c'è un difetto abbagliante nel mio codice? Avete qualche spiegazione per questo effetto?

push è il metodo che viene eseguito per inserire un messaggio nella casella di posta di un cliente. pull è il metodo che recupera l'elenco di tutti i messaggi accumulati come una lista e lo restituisce alla funzione di elaborazione principale.

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 []
È stato utile?

Soluzione

Credo di aver capito: è un bug in Pitone memcache modulo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top