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

con acquire. Este método libera el candado y bloquea al thread hasta<br />

que una llamada a notify o notifyAll en otro thread le indican que se<br />

ha cumplido la condición por la que esperaba. El thread que informa a<br />

los demás de que se ha producido la condición, también debe llamar a<br />

acquire antes de llamar a notify o notifyAll.<br />

Al llamar a notify, se informa del evento a un solo thread, y por tanto<br />

se despierta un solo thread. Al llamar a notifyAll se despiertan <strong>todos</strong><br />

los threads que esperaban a la condición.<br />

Tanto el thread que notifica como los que son notificados tienen que<br />

terminar liberando el lock con release.<br />

lista = []<br />

cond = threading.Condition()<br />

def consumir():<br />

cond.acquire()<br />

cond.wait()<br />

obj = lista.pop()<br />

cond.release()<br />

return obj<br />

def producir(obj):<br />

cond.acquire()<br />

lista.append(obj)<br />

cond.notify()<br />

cond.release()<br />

Los eventos, implementados mediante al clase Event, son un wrapper<br />

por encima de Condition y sirven principalmente <strong>para</strong> coordinar<br />

threads mediante señales que indican que se ha producido un evento.<br />

Los eventos nos abstraen del hecho de que estemos utilizando un Lock<br />

por debajo, por lo que carecen de mé<strong>todos</strong> acquire y release.<br />

El thread que debe esperar el evento llama al método wait y se bloquea,<br />

opcionalmente pasando como parámetro un número en coma<br />

flotante indicando el número máximo de segundos a esperar. Otro<br />

hilo, cuando ocurre el evento, manda la señal a los threads bloqueados<br />

a la espera de dicho evento utilizando el método set. Los threads que<br />

estaban esperando se desbloquean una vez recibida la señal. El flag que<br />

determina si se ha producido el evento se puede volver a establecer a<br />

falso usando clear.<br />

109

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

Saved successfully!

Ooh no, something went wrong!