[Python-es] Threads con operaciones I/O en Python

lasizoillo lasizoillo en gmail.com
Lun Jun 7 16:52:43 CEST 2010


El día 7 de junio de 2010 15:57, Félix Palazuelos Pérez
<felixpalazuelos en gmail.com> escribió:
> Hola, estoy inmerso en el desarrolo de una aplicación de audio via 485 con
> ossaudiodev y speex en python. Un ordenador tendra una gui en wxPython y un
> botón de hablar, al ir todo por puerto serie había pensado en crear un hilo
> para escuchar las tramas del puerto serie y el principal con la gui. ¿Mejor
> hilos que procesos teneindo en cuenta que el trabajo de speex (extensión en
> C) lo va a hacer el hilo? Necesito la máxima rápidez, ya que si no el sonido
> se entrecortaría. A ver si me podeís aconseja ren rendimiento de hilos y
> eso. Muchas gracias a todos :)
>

Procesos:
 * Se ejecutan en varios procesadores sin problemas
 * Por defecto no comparten memoria:
   * Puedes establecer memoria compartida
   * Puedes serializar datos mediante pipes. El módulo multiprocessing
trabaja así.

Hilos:
 * Por defecto comparte zonas de memoria aunque puedes tener los datos
propios de cada hilo.
   * Python evita problemas de concurrencia mediante el GIL.
Bloqueando todo. La multitarea se limita a un procesador ¡¿?!
 * Las funciones en C pueden desbloquear el GIL siempre que no usen
objetos de python (libreria speex por ejemplo), por lo que ejecutar el
código en varios procesadores no sería un problema.
 * La implementación de hilos en windows no apesta como la
implementación de multiproceso. Interesante si piensas portar el
código, aunque usando ossaudiodev igual esto no importa.

Yo te recomendaría usar hilos. Posiblemente la cosa te quede mucho más
sencilla que si andas con memoria compartida y sea mucho más eficiente
que si andas serializando y deserializando datos en la comunicación
entre procesos.

Otra opción sería usar Twisted. Que tiene multitarea cooperativa entre
eventos wxPython y otros poolers de eventos. Aparte de eso puede usar
hilos de python (que al usar librerias C pueden desactivar el GIL).
Pero a pesar de esta nueva opción, te sigo recomendando los hilos. Con
Twisted te olvidas de pensar en si un bloqueo es o no reentrante, de
condiciones de fin de carrera y otros "riesgos" de trabajar con hilos.
Por contra es un monstruo enorme, mal documentado, con sus propios
"riesgos" (la constante paranoia de si estas haciendo algo bloqueante
o no) y sus maneras propias de hacer las cosas.

Ahora es cuando te digo que olvides de todo el correo que acabas de
leer y recuerdes esta frase: "La optimización prematura es la raiz de
todo mal" ;-)

Un saludo:

Javi



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