Dal corso: Concetti della programmazione in Python

Polling

- Ci saranno momenti in cui avrai bisogno di un programma per rilevare che si è verificato un evento e quindi reagire a quell'evento eseguendo una determinata azione. Per raggiungere questo obiettivo, ci sono due approcci che puoi utilizzare, il polling o la programmazione basata sugli eventi. Con il metodo di polling, un programma controlla e controlla e controlla e controlla attivamente che si verifichi una determinata condizione, come la pressione di un pulsante, e quando vede che la condizione si è verificata, eseguirà un'azione appropriata. La mia casa è pronta per i miei amici, quindi ora sto solo aspettando che arrivi il ragazzo delle consegne della pizza. Quando arriva il pizzaiolo, dovrò eseguire l'azione appropriata aprendo la porta e prendendo la pizza. Quindi, come faccio a sapere quando il pizzaiolo è sotto il portico per prendere la mia pizza? Beh, potrei provare il metodo del sondaggio, e per farlo, dovrò alzarmi dal letto. Poi scendo le scale. (clic della porta) Controllo se è qui, non ancora. (clic della porta) Quindi torno su per le scale e poi torno a rilassarmi, ma non appena mi sdraio, devo rialzarmi e controllare se è qui. Scendo di nuovo le scale. (clic della porta) No, non è ancora qui. (clic della porta) Su per le scale vado, mi sdraio, mi alzo, scendo le scale un'altra volta, non ancora. (clic della porta) Di nuovo su, giù, su, giù di nuovo. (clic della porta) No, e torna su per le scale. Accidenti, è estenuante! Come puoi vedere, il polling non è un metodo molto efficiente. Mi ci vuole molta energia per correre su e giù per queste scale, controllando uno stato che si verifica raramente. Mi impedisce anche di fare qualcos'altro con il mio sabato pomeriggio. Un'applicazione per computer che implementa una routine di polling utilizza molti cicli, controllando lo stato che si verifica raramente, e programmi semplici e di basso livello come quelli che si potrebbero scrivere per un microcontrollore con un linguaggio come C, utilizzando il polling per eseguire I/O guidati da software potrebbero essere perfettamente accettabili. Se il programma è l'unica cosa in esecuzione sul microcontrollore, non importa se passiamo molti cicli a fare il polling. Le applicazioni e i linguaggi di livello superiore come Python o Java rispondono solitamente agli eventi da elementi come un'interfaccia utente grafica. Per questo, l'utilizzo di una routine di sondaggi sarebbe piuttosto dispendioso, ma potrebbero esserci momenti in cui i sondaggi sono l'unica opzione. Diamo quindi un'occhiata ad alcuni esempi di codice che implementa il polling in Python. Questo script di esempio rappresenta lo scenario che abbiamo appena visto quando ho corso su e giù per le scale per vedere se era arrivato l'addetto alla consegna della pizza. Nella parte superiore dello script, creiamo una variabile denominata hungry alla riga 3, che indica il mio stato attuale ed è inizializzata su True perché ho fame. Ecco perché ho bisogno della pizza. Dopodiché, il programma entra in un ciclo while alla riga 5, che verrà eseguito continuamente finché hungry è ancora vero. All'interno del loop, apro la porta d'ingresso, che simuliamo aprendo un file di testo chiamato front_door.txt. La funzione open restituisce un oggetto file, che è associato al nome della variabile front door alla riga 7. Diamo una rapida occhiata a quel file di testo, che è incluso nella stessa directory dei file degli esercizi. Questo file contiene le cose che sono fuori dalla mia porta di casa. Al momento ho un tappetino di benvenuto e un campanello, ma purtroppo non c'è un addetto alle consegne della pizza. Esaminando lo script dopo aver aperto il file di testo, l'istruzione if alla riga 9 verifica se la persona di consegna della stringa esiste o meno in quel file di testo front_door. Se lo fa, allora lancio un grido di gioia annunciando che la pizza è qui e metto la fame a False. Tuttavia, se il fattorino non è alla porta d'ingresso, allora dirò con voce molto affamata: "Non ancora..." Dopodiché, completerò il ciclo chiudendo la porta d'ingresso, che viene simulata chiudendo l'oggetto file alla riga 16. Se la pizza è arrivata e non ho più fame, il ciclo while uscirà dopo aver chiuso la porta. Altrimenti, come abbiamo visto in precedenza, il ciclo while verrà eseguito ancora e ancora e ancora e ancora e ancora mentre continuo a controllare. Ora per eseguire questo script dall'interno della directory in cui risiede in modo che possa trovare il file di testo front_door, farò clic con il pulsante destro del mouse sulla sua directory principale all'interno di VS Code, selezionerò l'opzione di terminale aperto e integrato e quindi chiamerò Python per eseguire lo script. Possiamo vedere che il ciclo while sta correndo più e più volte il più velocemente possibile per controllare l'arrivo della pizza. Dal momento che quella routine è in esecuzione senza interruzioni, stiamo fondamentalmente spendendo un intero core del processore solo per controllare se la persona della pizza è al piano di sotto, il che non è molto efficiente. Possiamo far arrivare quel pizzaiolo modificando il file di testo front_door in modo che contenga il fattorino. Non appena la modifica viene salvata nel file, la routine di polling vedrà che sono arrivati. Annuncerò che la pizza è qui e il ciclo while finirà e uscirà. In questo esempio viene illustrato il motivo per cui non è consigliabile utilizzare un ciclo while in esecuzione libera per implementare una routine di polling. Quando si crea una routine di polling, di solito è una buona idea includere una sorta di meccanismo di ritardo nel ciclo per impedirne l'esecuzione senza interruzioni, il che può sprecare risorse della CPU e impedire l'esecuzione di altre cose, o almeno rallentarle. In Python, possiamo farlo importando il modulo time nella parte superiore del nostro script. Quindi aggiungeremo la funzione time.sleep alla fine di questo ciclo while. In questo modo il programma attenderà un secondo quando arriva a quella riga. Dopo aver chiuso la porta d'ingresso, mi riposerò un secondo prima di andare a controllare di nuovo. Ora, prima di eseguire lo script, rimuoviamo il fattorino della pizza dal file di testo front_door, quindi chiamiamo Python per eseguire nuovamente lo script dall'interno del terminale. Non è del tutto ovvio solo guardando l'output, ma ora il ciclo while non funziona ininterrottamente a piena velocità. Si tratta solo di controllare l'arrivo del pizzaiolo una volta al secondo e, così facendo, non stiamo sovraccaricando la CPU. Il motivo per cui funziona è perché la funzione sleep utilizza un meccanismo chiamato interrupt, che consente al programma di dormire in un modo che non spreca i normali cicli della CPU, e poi si riattiva dopo un secondo per continuare l'esecuzione.

Contenuti