12.05.2013 Views

Python para todos

Python para todos

Python para todos

SHOW MORE
SHOW LESS

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 />

99

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

Saved successfully!

Ooh no, something went wrong!