[pyar] Duda, procesos e instancias

Martin Cerdeira martincerdeira en gmail.com
Lun Nov 14 11:25:13 ART 2011


2011/11/13 Roberto Alsina <ralsina en netmanagers.com.ar>

> 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.
>
> ______________________________**_________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/**listinfo/pyar<http://listas.python.org.ar/listinfo/pyar>
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>

Ah, ah, ah! Estaba meando completamente fuera del tarro!! jajajaja, claro!
Al tener procesos distintos, no puedo compartir la instancia! Voy a probar
con threads, gracias!

Saludos
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
()  ascii ribbon campaign
/\  www.asciiribbon.org
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20111114/810f26e5/attachment.html>


More information about the pyar mailing list