12.05.2013 Views

Python para todos

Python para todos

Python para todos

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Python</strong> <strong>para</strong> <strong>todos</strong><br />

hemos permitido entrar en la sección de código crítico a un hilo más.<br />

Cuando un hilo llama a release, la variable aumenta en 1.<br />

No es hasta que esta variable del semáforo es 0, que llamar a acquire<br />

producirá un bloqueo en el thread que realizó la petición, a la espera de<br />

que algún otro thread llame a release <strong>para</strong> liberar su plaza.<br />

Es importante destacar que el valor inicial de la variable tal como lo<br />

pasamos en el constructor, no es un límite máximo, sino que múltiples<br />

llamadas a release pueden hacer que el valor de la variable sea mayor<br />

que su valor original. Si no es esto lo que queremos, podemos utilizar<br />

la clase BoundedSemaphore en cuyo caso, ahora si, se consideraría un<br />

error llamar a release demasiadas veces, y se lanzaría una excepción de<br />

tipo ValueError de superarse el valor inicial.<br />

Podríamos utilizar los semáforos, por ejemplo, en un pequeño programa<br />

en el que múltiples threads descargaran datos de una URL, de<br />

forma que pudieramos limitar el número de conexiones a realizar al<br />

sitio web <strong>para</strong> no bombardear el sitio con cientos de peticiones concurrentes.<br />

semaforo = threading.Semaphore(4)<br />

def descargar(url):<br />

semaforo.acquire()<br />

urllib.urlretrieve(url)<br />

semaforo.release()<br />

Las condiciones (clase Condition) son de utilidad <strong>para</strong> hacer que los<br />

threads sólo puedan entrar en la sección crítica de darse una cierta<br />

condición o evento. Para esto utilizan un Lock pasado como parámetro,<br />

o crean un objeto RLock automaticamente si no se pasa ningún parámetro<br />

al constructor.<br />

Son especialmente adecuadas <strong>para</strong> el clásico problema de productorconsumidor.<br />

La clase cuenta con mé<strong>todos</strong> acquire y release, que llamarán<br />

a los mé<strong>todos</strong> correspondientes del candado asociado. También<br />

tenemos mé<strong>todos</strong> wait, notify y notifyAll.<br />

El método wait debe llamarse después de haber adquirido el candado<br />

104

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

Saved successfully!

Ooh no, something went wrong!