Re: Eventos señales y demás

Miuler miuler en gmail.com
Mie Dic 26 18:38:11 CET 2007


Gacias Pepe, al perecer las cosas tiran por este lado, tener que hacer
una lista con las referencias de quienes quiero que escuchen el
evento, claro usando weakref, jeje me acuerdo a ver leido una ves hace
tiempo sobre weakref, pero ya ni me acordaba, gracias otra vez, bueno
les dejo la url de otro ejemplo usando weakref:

http://osdir.com/ml/python.general.castellano/2004-03/msg00116.html

On Dec 26, 2007 6:34 AM, Pepe Aracil <pepe en diselpro.com> wrote:
> Hola Miuler.
>
> Mira este código que hice hace tiempo y que hace algo similar a lo
> que tu necesitas.
> Se trata de un sitema de envío y recepción de mensajes por subscripción.
> Cada clase que deba recibir mensajes, debe tener un método broadcast_cb
> y debe subscribirse a los mensajes que quiere recibir.
>
> Aquí tienes el código que viene con un ejemplo:
>
> [code broadcast.py]
> #! /usr/bin/python
> import weakref
>
> class Broadcast:
>      def __init__(self):
>          self.messages={}
>
>      def __purge_cb(self,ref):
>          #print "Eliminando %s" % ref
>          for msg in self.messages.keys():
>              if (ref in self.messages[msg]):
>                  self.messages[msg].remove(ref)
>                  if len(self.messages[msg]) == 0:
>                      del(self.messages[msg])
>
>      def register(self,owner,messages):
>          wr_owner = weakref.ref(owner,self.__purge_cb)
>          #print "Registrando %s" % wr_owner
>          if not isinstance(messages,(list,tuple)):
>              messages = (messages,)
>
>          for msg in messages:
>              if not (msg in self.messages):
>                  self.messages[msg] = []
>              if not (wr_owner in self.messages[msg]):
>                  self.messages[msg].append(wr_owner)
>
>      def unregister(self,owner,messages):
>          wr_owner = weakref.ref(owner)
>          if not isinstance(messages,(list,tuple)):
>              messages = (messages,)
>
>          for msg in messages:
>              if not (msg in self.messages):
>                  continue
>              if (wr_owner in self.messages[msg]):
>                  self.messages[msg].remove(wr_owner)
>
>      def unregister_all(self,owner):
>          all_messages = self.messages.keys()
>          self.unregister(owner,all_messages)
>
>      def broadcast(self,sender,message,*params):
>          results=[]
>          # Enviamos mensaje a los listeners "promiscuos"
>          if "_promisc_" in self.messages:
>              for lst in self.messages["_promisc_"]:
>                  ref=lst()
>                  if ref:
>                      ref.broadcast_cb(sender,message,*params)
>
>          # Enviamos mensaje a los listeners subscritos
>          if message in self.messages:
>              for lst in self.messages[message]:
>                  ref=lst()
>                  if ref:
>                      res = ref.broadcast_cb(sender,message,*params)
>                      if res <> None:
>                          results.append((sender,res))
>          if len(results) > 0:
>              return results
>
>
> if __name__=="__main__":
>
>      class WindowA:
>          def __init__(self,broadcast):
>              self.broadcast = broadcast
>              self.broadcast.register(self,("Mensaje1","Mensaje2"))
>
>          def broadcast_cb(self,sender,message,*params):
>              print "Recibido desde %s" % self
>              print "Enviado por %s" % sender
>              print "Mensaje %s" % message
>              print "Paramatros extra %s" % (params,)
>              return "Retorno WindowA"
>
>      class WindowB:
>          def __init__(self,broadcast):
>              self.broadcast = broadcast
>              self.broadcast.register(self,("Mensaje1"))
>
>          def broadcast_cb(self,sender,message,*params):
>              print "Recibido desde %s" % self
>              print "Enviado por %s" % sender
>              print "Mensaje %s" % message
>              print "Paramatros extra %s" % (params,)
>              return "Retorno WindowB"
>
>
>      broadcast = Broadcast()
>      wina=WindowA(broadcast)
>      winb=WindowB(broadcast)
>
>      ret = broadcast.broadcast(None,"Mensaje1",1,2,3)
>      print "Retorno: %s" %(ret,)
>      ret = broadcast.broadcast(None,"Mensaje2",3,4,5)
>      print "Retorno: %s" %(ret,)
>      print
>
>      broadcast.unregister(wina,"Mensaje2")
>      print "wina se ha desregistrado de Mensaje2"
>      ret = broadcast.broadcast(None,"Mensaje1",1,2,3)
>      print "Retorno: %s" %(ret,)
>      ret = broadcast.broadcast(None,"Mensaje2",3,4,5)
>      print "Retorno: %s" %(ret,)
>      print
>
>      del(winb)
>      print "winb eliminada"
>      ret = broadcast.broadcast(None,"Mensaje1",1,2,3)
>      print "Retorno: %s" %(ret,)
>      ret = broadcast.broadcast(None,"Mensaje2",3,4,5)
>      print "Retorno: %s" %(ret,)
>      print
> [code end]
>
-- 
     _\|/_
     (O-O)
--oOO-(_)-OOo----------------------------------------
Hector Miuler Malpica Gallegos
Universidad Nacional del Callao - Peru
Escuela de Ingenieria Electronica

usuario registrado #308608
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es