[pyar] Duda, procesos e instancias

Gerardo Allende gerardoallende en gmail.com
Dom Nov 13 23:19:22 ART 2011


El día 13 de noviembre de 2011 22:59, Martin Cerdeira
<martincerdeira en gmail.com> escribió:
> 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??
>
> Gracias!!!
> -------------------------------------
> Martín Cerdeira - Software Developer
> [web] http://www.codmacs.blogspot.com/
> ()  ascii ribbon campaign
> /\  www.asciiribbon.org
>

Hola, probé esto:

#import debugger
import time
import multiprocessing

def lolo(db):
    print db
    db.debug("uno.py")

def lala():
    db = 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)

class Debugger:
    """A simple example class"""
    i = 12345
    def debug(self,prg):
        print 'Debugging:', prg
    def comando(self,cmd):
        print 'Comando:', cmd

if __name__ == '__main__':
   lala()

Pero me devuelve esto:

lanzo
esperando 5 segundos para mandar comando
<__main__.Debugger instance at 0x20b1b48>
Debugging: uno.py
mando comando s a  <__main__.Debugger instance at 0x20b1b48>
Comando: s

Veo que las instancias son las mismas, no sé por qué a vos sí te manda
instancias distintas.

Saludos



More information about the pyar mailing list