7.5.1 Oggetti Lock

Un lock primitivo è una primitiva di sincronizzazione che non è posseduta da nessun particolare thread quando è bloccata. In Python, al momento è la primitiva di sincronizzazione di più basso livello disponibile, implementata direttamente dal modulo di estensione thread.

Un lock primitivo si trova in uno dei due stati, ``bloccato'' o ``sbloccato''. Viene creato nello stato sbloccato. Possiede due metodi di base, acquire() e release(). Quando lo stato è sbloccato. acquire() modifica lo stato a bloccato, e restituisce immediatamente. Quando lo stato è bloccato, acquire() si blocca fino che la chiamata release() in un altro thread lo modifichi a sbloccato, quindi la chiamata a acquire() lo reimposta in modo bloccato e restituisce. Il metodo release() dovrebbe essere chiamato solo nello stato bloccato; modifica lo stato in sbloccato e restituisce immediatamente. Quando più di un thread è bloccato in acquire(), in attesa che lo stato venga cambiato in sbloccato, solo un thread procede quando una chiamata a release() reimposta lo stato a sbloccato; quale dei thread in attesa procederà in seguito non è definito, e può variare a seconda dell'implementazione.

Tutti i metodi sono eseguiti atomicamente.

acquire( [blocking = 1])
Acquisisce un lock, bloccante o non bloccante.

Quando viene invocato senza argomenti, si blocca fino a che il lock è sbloccato, quindi lo blocca e restituisce. Non c'è alcun valore restituito in questo caso.

Quando viene invocato con l'argomento blocking impostato a vero, esegue le stesse cose di quando viene chiamato senza argomenti, e restituisce vero.

Quando viene invocato con l'argomento blocking impostato a falso, non si blocca. Se una chiamata senza un argomento si bloccherebbe, restituisce falso immediatamente; altrimenti, esegue le stesse azioni di quando viene chiamato senza argomenti, e restituisce vero.

release( )
Rilascia un lock.

Quando un lock è bloccato, lo reimposta come sbloccato, e restituisce. Se qualunque altro thread è bloccato in attesa che il lock si sblocchi, permette solo a uno di loro di procedere.

Non chiamare questo metodo quando il lock è sbloccato.

Non esiste valore di ritorno.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.