[pyar] usando multiprocessing

Hernan Grecco hernan.grecco en gmail.com
Jue Dic 12 12:41:17 ART 2013


Hola Anielkis,


Por lo que veo FilesSender no guarda ningun estado. Podrias hacer esto
mas facil usando concurrent.futures [0]. Esto te permite cambiar de
threads a procesos facilmente segun el tipo de carga que tengas y
debugear es mas facil.
A menos que realmente necesites tener varios procesos abiertos
escuchando un queue, la opcion que te propongo es mas simple.

Algunos comentarios extras:
1.- Cuando haces logger.debug o logger.info, no es necesario que
escribas: '[DEBUG]' e '[INFO]'. Eso ya está en la registro de log y lo
podés mostrar cambiando el log formatter, agregando levelname. Lee [1]
2.- Cambia todo los print "algo" a print("algo") asi ya lo tenes listo
para python 3.
3.- Cambia: "if len(fileList) > 0:" por ïf len(fileList)" o mejor aun
"if fileList" (si fileList realmente es un objeto cuyo valor booleano
es True cuando no está vacio.
4.- yo prefiero hacer "logger = logging.getLogger(__name__)" al
principio y evitar "global logger"
5.- En Python 3.3+, la funcion checkout de subprocess tiene un
argument timeout. En python 2, podes usar [2]

Hernán

[0] http://docs.python.org/3/library/concurrent.futures.html
[1] http://docs.python.org/2/howto/logging.html#configuring-logging
[2] https://pypi.python.org/pypi/subprocess32/


2013/12/12 Anielkis Herrera <anielkis en gmail.com>:
> gracias por responder tan rápido, Hernan .. por lo visto pueden pasar 1000
> veces lo mismo.. y a las 1000+1 verse de forma distinta.. solucioné el
> problema y .. es un poco extraño.. tenía, como "en la vieja escuela", prints
> antes y después de cada sección crítica, incluso con ese join(línea 131) y
> nunca se mostraba el de después del join .. volví a revisar el código y
> luego de esa línea tenía un join de una antigua queue.. y daba una
> excepción, pero tampoco me llegaba a salir el print de la excepción..
> eliminándolo.. todo fluyó
>
> no obstante, aqui está el gist: https://gist.github.com/DimShadoWWW/7929379
> aún debo tener "varios" problemas ahi y varias "mejores formas" de hacerlo,
> me gustaría saber sus opiniones.. pues si algo he aprendido.. es que
> mientras más se aprende.. más cosas "se ve que" faltan por aprender
>
> muchas gracias,
>
>
> El 12 de diciembre de 2013 09:49, Hernan Grecco<hernan.grecco en gmail.com>
> escribió:
>
>> Hola Anielkis,
>>
>> Podes subir el programa completo a gist de github?
>>
>> Hernan
>>
>>
>>
>> 2013/12/12 Anielkis Herrera <anielkis en gmail.com>:
>> > Hola, buenos días.. les escribo porque llevo varios días intentando
>> > implementar un sistema de gestión de procesos usando multiprocessing y
>> > sigo
>> > teniendo un problema con las queues de multiprocessing.. el sistema
>> > funciona
>> > de esta forma:
>> >
>> > tengo un proceso que revisa una tabla en una base de datos y según la
>> > información, la inserta en una queue de tipo
>> > multiprocessing.JoinableQueue(), luego creo otra "de resultados" de tipo
>> > multiprocessing.Queue() donde se almacenarán los "resultados de los
>> > procesos" que procesarán la primera.
>> >
>> > tengo una clase: "class Worker(multiprocessing.Process)" donde en el
>> > método
>> > run defino lo que deseo hacer con la queue (llamando a
>> > inqueue.task_done()
>> > siempre que termina el proceso ) que básicamente executa comandos por
>> > subprocess.popen ..
>> > e invoco a esa clase de esta forma:
>> >
>> > consumers = [ Worker(inqueue, outqueue)
>> >                   for i in xrange(10) ]
>> >
>> > for w in consumers:
>> >     w.start()
>> >
>> > inqueue.join()  # <---- aqui es donde se queda
>> >
>> > ...........
>> > el problema es que todo funciona bien, hasta el .join de la
>> > JoinableQueue,
>> > incluso, si hago "print inqueue.qsize()" antes del join, poniendo una
>> > espera
>> > de tiempo, para que el Worker termine la tarea que le puse.. y el qsize
>> > dice
>> > que tiene 0 en la queue .. se queda ahi, esperando y no continúa..
>> >
>> > llevo varios día probando, incluso, usé multiprocessing.Queue() en esa
>> > queue, y usé un método en vez del Worker, con una lista de procesos
>> > Worker y
>> > un jopin al final y aún así se queda esperando, en el join
>> >
>> > traté de explicarme lo mejor posible.. la verdad es que llegué a
>> > "bloquearme" .. y ya no sé qué más probar en ese código... sé que esto
>> > es
>> > fácil hacerlo con herramientas como celery, pero no me es posible usarla
>> > en
>> > estos momentos.. y he estado revisando la documentación que he
>> > encontrado en
>> > internet y no encuentro ninguna otra pista que seguir
>> >
>> > el entorno donde debe funcionar es un centos 6, que tiene python 2.6.6 y
>> > lo
>> > he probado hasta python 2.6.8 y siempre mantiene el comportamiento
>> >
>> > alguna idea que deba revisar? muchas gracias de antemano
>> >
>> > --
>> > _______________________________
>> >         Anielkis Herrera González
>> >
>> > _______________________________________________
>> > pyar mailing list pyar en python.org.ar
>> > 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
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> 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
>
>
>
>
> --
> _______________________________
>         Anielkis Herrera González
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> 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


More information about the pyar mailing list