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