28.06.2017 Views

Python para todos

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!