[pyar] Duda, procesos e instancias

Roberto Alsina ralsina en netmanagers.com.ar
Dom Nov 13 23:30:58 ART 2011


On 11/13/2011 10:59 PM, Martin Cerdeira wrote:
> Hola lista. Estaba armando un programa que usa multiprocessing y, 
> queriendo pasar una instancia de una clase, no logro hacerlo. Probé de 
> 2 formas, pasandole el parámetro directamente y utilizando el objeto 
> Queue. La instancia es de una clase mía que se llama debugger:
>
> import debugger
> import time
> import multiprocessing
>
> def lolo(q):
>     db = q.get()[0]
>     print db
>     db.debug("uno.py")
>
> def lala():
>     db = debugger.Debugger()
>     q = multiprocessing.Queue()
>     q.put([db])
>     hilo = multiprocessing.Process(target=lolo, args=(q,))
>     hilo.start()
>     print "lanzo"
>     while hilo.is_alive():
>         print "esperando 5 segundos para mandar comando"
>         time.sleep(5)
>         print "mando comando s a ", db
>         db.comando("s")
>         hilo.join(.3)
>
> if __name__ == '__main__':
>    lala()
>
>
> Con los print db, veo que la instancia de la clase no es la misma. Yo 
> necesito pasarle la instancia, como si fuera por referencia.
> También intenté esto:
>
> import debugger
> import time
> import multiprocessing
>
> def lolo(db):
>     print db
>     db.debug("uno.py")
>
> def lala():
>     db = debugger.Debugger()
>     hilo = multiprocessing.Process(target=lolo, args=(db,))
>     hilo.start()
>     print "lanzo"
>     while hilo.is_alive():
>         print "esperando 5 segundos para mandar comando"
>         time.sleep(5)
>         print "mando comando s a ", db
>         db.comando("s")
>         hilo.join(.3)
>
> if __name__ == '__main__':
>    lala()
>
> Un ejemplo de lo que veo por pantalla es:
>
> <debugger.Debugger instance at 0x000000000245E8C8>   # Este es el 
> print que esta en lolo()
>
> mando comando s a <debugger.Debugger instance at 0x00000000022D2048> # 
> Este es el segundo print, en lala(), donde se ve que la instancia es otra.
>
> En qué le estoy errando? Sé que python toma "deciciones" sobre si 
> pasar por parámetro o por referencia tomando en cuenta la 
> inmutabilidad de los objetos. Imagino que este problema pasa por ahí, 
> hay forma de explicitamente decirle que me pase la referencia del objeto??

Estás un poco confundido, pero creo que sé porqué :-)

Lo estás pasando de un proceso a otro. Una instancia es un cacho de 
memoria. ¿Cómo va a ser la misma, si los procesos no comparten memoria?

Si esto fueran threads, podría ser la misma instancia. Si no me falla la 
memoria, lo que hace Queue es hacer un pickle del objeto, y 
'despicklearlo' en el otro proceso.



More information about the pyar mailing list