Re: [Python-es] Dudas sobre concurrencia: ¿fork o threads?
Miguel Araujo
muchochini en gmail.com
Lun Feb 18 12:41:43 CET 2008
¡Genial!
Gracias por la información. Ya veo como funciona esto del GIL, el problema
es cuando hay un deadlock que no estaba previsto. De momento me estoy
apañando bastante bien, ya que uso funciones "thread-safe" por llamarlas de
algún modo.
Me ha sorprendido que cuando tienes varios hilos abiertos, hay veces que uno
hace un print y no sale por pantalla. Lo he solucionado con un pequeño mutex
para la pantalla.
Un saludo y gracias por la explicación,
Miguel
El día 18/02/08, Chema Cortes <pych3m4 en gmail.com> escribió:
>
> 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