Pregunta

He escrito un GEvent programa basado en que permite a sus clientes de Internet para intercambiar mensajes de forma rápida a través de él (por lo que funciona como un concentrador).

Desde que sólo admiten mecanismo de sondeo en este momento, lo he escrito para almacenar los mensajes que deben ser entregados a un cliente específico en su 'bandeja de entrada' en el lado del servidor. Mientras que la lista de clientes se almacena en MySQL, estas bandejas de entrada se almacenan en Memcache para un acceso más rápido. Cuando un cliente se conecta al concentrador, que tira de todos los mensajes que se han acumulado en su bandeja de entrada.

La pregunta
El problema es que una vez en un corto periodo de tiempo los destinatarios no reciben sus mensajes cuando se tira el contenido de su bandeja de entrada - que reciben una matriz vacía
. Lo que me intriga aún más es que si vuelvo a poner el cubo, los mensajes que no fueron recibidos por los clientes de repente se materialicen y se entreguen a sus destinos.
¿Me puede indicar si hay un defecto evidente en mi código? ¿Tiene alguna explicación a este efecto?

push es el método que se ejecuta para colocar un mensaje en el buzón de entrada de un cliente. pull es el método que recupera la lista de todos los mensajes acumulados como una lista y lo devuelve a la función principal de procesamiento.

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 []
¿Fue útil?

Solución

Creo que lo tengo: se trata de un error en el Python- memcache módulo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top