You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Threads<br />
Los threads son un concepto similar a los procesos: también se trata de<br />
código en ejecución. Sin embargo los threads se ejecutan dentro de un<br />
proceso, y los threads del proceso comparten recursos entre si, como la<br />
memoria, por ejemplo.<br />
El sistema operativo necesita menos recursos <strong>para</strong> crear y gestionar los<br />
threads, y al compartir recursos, el cambio de contexto es más rápido.<br />
Además, dado que los threads comparten el mismo espacio de memoria<br />
global, es sencillo compartir información entre ellos: cualquier<br />
variable global que tengamos en nuestro programa es vista por <strong>todos</strong><br />
los threads.<br />
El GIL<br />
La ejecución de los threads en <strong>Python</strong> está controlada por el GIL<br />
(Global Interpreter Lock) de forma que sólo un thread puede ejecutarse<br />
a la vez, independientemente del número de procesadores con el que<br />
cuente la máquina. Esto posibilita que el escribir extensiones en C <strong>para</strong><br />
<strong>Python</strong> sea mucho más sencillo, pero tiene la desventaja de limitar mucho<br />
el rendimiento, por lo que a pesar de todo, en <strong>Python</strong>, en ocasiones<br />
nos puede interesar más utilizar procesos que threads, que no sufren de<br />
esta limitación.<br />
Cada cierto número de instrucciones de bytecode la máquina virtual<br />
<strong>para</strong> la ejecución del thread y elige otro de entre los que estaban esperando.<br />
Por defecto el cambio de thread se realiza cada 10 instrucciones de<br />
bytecode, aunque se puede modificar mediante la función sys.setcheckinterval.<br />
También se cambia de thread cuando el hilo se pone a<br />
dormir con time.sleep o cuando comienza una operación de entrada/<br />
salida, las cuales pueden tardar mucho en finalizar, y por lo tanto, de no<br />
realizar el cambio, tendríamos a la CPU demasiado tiempo sin trabajar<br />
esperando a que la operación de E/S terminara.<br />
Para minimizar un poco el efecto del GIL en el rendimiento de nuestra<br />
aplicación es conveniente llamar al intérprete con el flag -O, lo que<br />
hará que se genere un bytecode optimizado con menos instrucciones, y,<br />
103