Esempio n. 1: esecuzione di script thread Python utilizzando il timeout in acquisito ().
Discuteremo l'uso del metodo "Acquis ()" del blocco in questo esempio. Il metodo "acquisito ()" può essere utilizzato per bloccare. Non si possono fare più sforzi per raggiungere questo obiettivo fino a quando il blocco non è stato rilasciato una volta che un thread ha bloccato il blocco. Il metodo "acquisito ()" può essere utilizzato per fissare un blocco. Una volta che un thread ha fissato il blocco, non possono essere fatti ulteriori tentativi fino a quando il blocco non è stato rilasciato. L'opzione "timeout" verrà utilizzata anche in questa istanza del metodo "acquisito ()" per specificare per quanto tempo verrà ritardato il thread chiamante se un'altra operazione sta già tentando di ottenere il blocco. Se il valore potenziale del thread è 1, che è 1, il thread verrà ritardato indefinitamente fino a quando non acquisisce il blocco. Qui, abbiamo usato questo per determinare per quanto tempo un thread cercherà un blocco.
Iniziamo a implementare lo script utilizzando lo strumento "Spyder" per implementare il codice. Prima importeremo il blocco e il filo dalla libreria di threading Python. I thread sono utilizzati in un processo Python per eseguire l'esecuzione del codice. Ogni programma ha un thread per impostazione predefinita, ma potremmo dover produrre più thread se vogliamo fare diversi processi contemporaneamente. Il modulo di sonno viene quindi importato. Il metodo "Sleep ()" nel modulo temporale di Python viene utilizzato per mettere in pausa l'esecuzione di un programma per una quantità di tempo predeterminata. Ciò suggerisce che il programma viene temporaneamente sospeso prima di essere eseguito automaticamente dopo un periodo predeterminato. Successivamente, viene utilizzato il metodo "Lock ()". Quindi, nella riga seguente, definiamo una funzione con il nome "func1" e passiamo la variabile "blocco" nelle sue parentesi.
L'istruzione "if" abilita l'esecuzione di una dichiarazione o un insieme di dichiarazioni in circostanze specifiche in base all'esito di un'espressione. Usiamo il metodo "acquisito ()" sull'oggetto blocco all'interno della condizione "if" in modo che il thread attenda continuamente il blocco. Passiamo un timeout come uno dei suoi parametri e lo impostiamo su "10" nelle parentesi della funzione "Acquis ()". Ora, se l'istruzione soddisfa il requisito, utilizziamo la funzione "print ()", passando l'istruzione "thread 2: fatto" nelle sue parentesi, quindi chiamiamo il metodo di rilascio () su un modulo oggetto Lock. Se il blocco è bloccato, questo processo reagirà dopo averlo rivisto allo stato sbloccato.
Inoltre, questo metodo può essere chiamato da qualsiasi thread. È consentito per uno dei thread che stanno già aspettando di acquisire la presa per appenderla fino a quando questa funzione non viene chiamata. Ora stampiamo l'istruzione "thread 1: timeout" se la condizione non è soddisfatta. Ora creeremo una nuova funzione con il nome "func" e il blocco dei parametri nella riga seguente. Quindi, usando l'oggetto Lock, eseguiamo il metodo "Acquire ()". Nella riga seguente, chiamiamo quindi la funzione "Print ()" e forniamo l'istruzione "Thread 1: Done" prima di utilizzare il metodo "Release ()" con il blocco.
Ora creeremo un thread e chiameremo i metodi del thread chiamando l'oggetto thread. Abbiamo usato un thread e abbiamo impostato "target = func" al suo interno, passando l'argomento "blocco",. Quindi, abbiamo salvato questo thread in una variabile chiamata "thread1."Nella riga successiva, abbiamo chiamato" func1 "con il thread e abbiamo superato l'argomento" blocco ", usando" thread1.start () "per avviare il thread. Abbiamo fatto lo stesso per thread2. Il metodo "join ()" viene quindi utilizzato per attendere l'esecuzione del thread. Pertanto, abbiamo due thread, ognuno dei quali chiama due routine distinte. Il timeout per il secondo thread è "10" secondi, mentre il primo thread funziona per "2" secondi.
Il display di output ora mostra che il thread 1 viene eseguito per primo da quando è stato generato per primo ed è stato in grado di accedere al blocco e terminare la sua esecuzione. Il thread 2 è finito perché il timeout è stato impostato su "10" secondi, come si può vedere.
Esempio n. 2: usando il blocco del thread di Python in una condizione di gara
Useremo il blocco del thread Python in una condizione di gara in questo esempio. Una condizione di gara si verifica quando due thread guardano contemporaneamente una variabile condivisa. I thread iniziali e secondi hanno ricevuto lo stesso risultato dalla costante del thread originale. Quindi, i due thread tentano di modificare il valore comune della variabile dipendente. I dati dal thread che si aggiungono all'elenco delle variabili condivisi vengono mantenuti perché cancella il valore che il thread precedente ha scritto.
Cominciamo ad implementare il codice. Nella prima riga, importiamo il modulo di blocco dal modulo di threading. E nella riga seguente, importiamo il modulo temporale. Quindi, creiamo una variabile e gli diamo il valore "20". Nella riga successiva, creiamo una funzione chiamata "func1" e passiamo due variabili "incremento" e "blocco" come parametri. Creiamo una variabile globale chiamata "A" e passiamo un blocco.
Infine, nella riga seguente, creiamo una variabile chiamata "local_counter" e la passiamo in esso. Il valore di questo "contatore locale" è incrementato nella riga successiva a seconda del thread che termina. Quindi, chiamiamo il "tempo.Metodo sleep () "e fornire un periodo di" 0.5 "secondi nella riga seguente. Viene quindi eseguito il metodo "Print ()" e il contatore locale viene salvato nella variabile "A". All'interno di questa funzione, il thread corrente viene chiamato usando "threading.current_thread ().Nome incremento a per incremento "e passa la" a "in cui viene memorizzato il valore e il metodo" rilascio () "con blocco viene chiamato nella riga seguente. Nella riga successiva, passiamo il metodo Lock ().
Ora, creeremo due thread e chiameremo la funzione usando i thread. Chiamiamo la funzione nel primo thread usando il threading.Discussione, usato "target = func1" e passare l'argomento "15" come incremento e "blocco". Abbiamo memorizzato questo primo thread nella variabile "T1" e poi ripetiamo la stessa procedura per il thread 2 ma passiamo l'argomento che è l'incremento di "5" e "blocco". Quindi, usiamo “Thread.start () "per avviare il thread e" join () "per attendere che il thread finisca in esecuzione. Verrà quindi visualizzato il valore finale.
Ora, semplicemente inserire questo codice fa sì che entrambi i thread leggano il valore che abbiamo condiviso. "T1" e "T2" cercheranno di alterare il valore di "A" nella funzione di incremento usando i valori di incremento "15" e "5" forniti nella tupla dei parametri.
Ora visualizza il risultato finale "40" nell'output. Poiché abbiamo "a = 20" nel codice sopra, quando "thread 1" aumenta di "15", il risultato è "35" e il valore cambia a "35", tuttavia, quando "thread 2" aumenta di "5" Il risultato è "40".
Conclusione
La funzione di blocco del thread Python che ha due metodi: acquisire () e rilascio () è trattata in questo articolo. In questa guida sono presentati due esempi. In primo luogo, abbiamo usato un timeout in un blocco acquisito () e, nel secondo esempio, abbiamo usato una condizione di gara usando Python Lock () per mostrare come funzionano come funzionano i thread. Prevediamo che troverai questi casi utili quando usi i blocchi del filo Python.