Re: Dudas sobre concurrencia: ¿fork o threads?

Chema Cortes pych3m4 en gmail.com
Lun Feb 18 12:29:25 CET 2008


El 18/02/08, Miguel Araujo <muchochini en gmail.com> escribió:

> Pero perdona mi ignorancia. No se supone que esto pasa en todos los
> lenguajes. Los procesos o hilos corren aparentemente en paralelo, aunque
> solamente uno está en ejecución en todo momento, salvo que haya varios cores
> o procesadores ¿no?

Efectivamente, el sistema operativo controla la
activación/desactivación de cada hilo de modo que en máquinas
monoprocesador sólo un hilo se ejecute simultáneamente. El cambio
entre hilo puede ser preemptivo o de tipo corrutina.

El problema está (como parece que has visto en los bucles) que CPython
libera el bloqueo GIL de un hilo después de ejecutar un número
determinado de instrucciones bytecode (sys.getcheckinterval()),
normalmente después de 100 instrucciones bytecode ejecutadas. Si
resulta que un hilo python lanza una extensión hecha en C "mal
programada" (por ejemplo, una que se quede bloqueada esperando datos
de un periférico), te puedes encontrar con que el intérprete python se
queda totalmente parado hasta que termine la ejecución de la
extensión.

> Me he decantado por los threads porque me resultan más sencillos, es la
> costumbre de ADA. De todos modos hay cosas que me están sorprendiendo,
> parece que Python no hace bien los cambios de contexto entre hilos. Cuando
> un hilo empieza en un bucle, los demás aparentemente no ejecutan. Por lo que
> he leído Python no está muy pensado para esto del threading.

No sabría decirte qué te puede pasar. Como te he dicho, es necesario
que se ejecuten un número determinado de bytecodes antes de cambiar de
contexto. Prueba a bajar éste número con
sys.setcheckinterval(nbytecodes)
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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