Articles

GeeksforGeeks

Gestione delle risorse: In qualsiasi linguaggio di programmazione, l’utilizzo di risorse come le operazioni sui file o le connessioni al database è molto comune. Ma queste risorse sono limitate nell’offerta. Pertanto, il problema principale sta nel fare in modo di rilasciare queste risorse dopo l’uso. Se non vengono rilasciati, ciò porterà a perdite di risorse e potrebbe causare il rallentamento o il crash del sistema. Sarebbe molto utile se l’utente avesse un meccanismo per la configurazione automatica e il teardown delle risorse.In Python, può essere ottenuto mediante l’utilizzo di gestori di contesto che facilitano la corretta gestione delle risorse. Il modo più comune di eseguire operazioni sui file è utilizzando la parola chiave with come mostrato di seguito:

with open("test.txt") as f:
data =f.read()



Let’s take the example of file gestione. Quando un file viene aperto, viene utilizzato un descrittore di file che è una risorsa limitata. Solo un certo numero di file può essere aperto da un processo alla volta. Il seguente programma lo dimostra.

file_descriptors =
forx inrange(100000):
file_descriptors.append(open('test.txt', 'w'))



Uscita:

Traceback (most recent call last): File "context.py", line 3, in OSError: Too many open files: 'test.txt'

Un messaggio di errore dicendo che ci sono troppi file aperti. L’esempio sopra è un caso di perdita di descrittore di file. Succede perché ci sono troppi file aperti e non sono chiusi. Ci potrebbero essere possibilità in cui un programmatore potrebbe dimenticare di chiudere un file aperto.

Gestione delle risorse utilizzando context manager :

Supponiamo che un blocco di codice sollevi un’eccezione o se ha un algoritmo complesso con più percorsi di ritorno, diventa ingombrante chiudere un file in tutti i punti.
Generalmente in altre lingue quando si lavora con i file try-except-finally viene utilizzato per garantire che la risorsa file venga chiusa dopo l’utilizzo anche se esiste un’eccezione.Python fornisce un modo semplice per gestire le risorse: Context Manager. Viene utilizzata la parola chiave with. Quando viene valutato dovrebbe risultare in un oggetto che esegue la gestione del contesto. I gestori di contesto possono essere scritti utilizzando classi o funzioni(con decoratori).

Creazione di un gestore di contesto:

Quando si creano gestori di contesto utilizzando le classi, l’utente deve assicurarsi che la classe abbia i metodi: __enter__() e __exit__(). _ _ enter _ _ () restituisce la risorsa che deve essere gestita e _ _ exit _ _ () non restituisce nulla ma esegue le operazioni di pulizia.
Innanzitutto, consente di creare una classe semplice chiamata ContextManager per comprendere la struttura di base della creazione di gestori di contesto utilizzando le classi, come mostrato di seguito:

classContextManager():
def__init__(self):
print('init method called')
def__enter__(self):
print('enter method called')
returnself
def__exit__(self, exc_type, exc_value, exc_traceback):
print('exit method called')
with ContextManager() as manager:
print('with statement block')



Output:

init method calledenter method calledwith statement blockexit method called

In questo caso viene creato un oggetto ContextManager. Questo viene assegnato alla variabile dopo la parola chiave as cioè manager. Sull’esecuzione del programma di cui sopra, i seguenti eseguite in sequenza:

  • __init__()
  • __enter__()
  • dichiarazione corpo (codice all’interno del blocco)
  • __uscita__()

la gestione dei File usando il contesto manager :

proviamo ad applicare il concetto di cui sopra per creare una classe che aiuta nel file di gestione delle risorse.La classe FileManager aiuta ad aprire un file, scrivere / leggere il contenuto e poi chiuderlo.

classFileManager():
def__init__(self, filename, mode):
self.filename =filename
self.mode =mode
self.file=None
def__enter__(self):
self.file=open(self.filename, self.mode)
returnself.file
def__exit__(self, exc_type, exc_value, exc_traceback):
self.file.close()
with FileManager('test.txt', 'w') as f:
f.write('Test')
print(f.closed)



Output:

True

Gestione dei file utilizzando context manager e with statement:

All’esecuzione del blocco with, le seguenti operazioni avvengono in sequenza:

  • Un oggetto FileManager viene creato con test.txt come nome del file e w (write) come modalità quando viene eseguito il metodo __init__.
  • Il metodo __enter__ apre il test.file txt in modalità di scrittura (operazione di setup) e restituisce l’oggetto FileManager alla variabile f.
  • Il testo ‘Test’ viene scritto nel file.
  • Il metodo __exit__ si occupa di chiudere il file all’uscita del blocco with(operazione di teardown).
    Quando viene eseguito print(f.closed), l’output è True poiché il FileManager si è già occupato della chiusura del file che altrimenti doveva essere fatto esplicitamente.

Gestione della connessione al database utilizzando context manager:

Creiamo un semplice sistema di gestione della connessione al database. Anche il numero di connessioni al database che possono essere aperte alla volta è limitato(proprio come i descrittori di file). Pertanto i gestori di contesto sono utili nella gestione delle connessioni al database in quanto potrebbero esserci possibilità che il programmatore dimentichi di chiudere la connessione.

frompymongo importMongoClient
classMongoDBConnectionManager():
def__init__(self, hostname, port):
self.hostname =hostname
self.port =port
self.connection =None
def__enter__(self):
self.connection =MongoClient(self.hostname, self.port)
returnself
def__exit__(self, exc_type, exc_value, exc_traceback):
self.connection.close()
with MongoDBConnectionManager('localhost', '27017') as mongo:
collection =mongo.connection.SampleDb.test
data =collection.find({'_id': 1})
print(data.get('name'))



connessione al Database di gestione nel contesto manager e con l’istruzione :

eseguire il blocco, le seguenti operazioni avvengono in sequenza:

  • Un MongoDBConnectionManager oggetto viene creato con localhost come hostnamename e 27017 come la porta quando __init__ esecuzione del metodo.
  • Il metodo __enter__ apre la connessione mongodb e restituisce l’oggetto MongoDBConnectionManager alla variabile mongo.
  • Si accede alla raccolta di test nel database SampleDb e viene recuperato il documento con _id=1. Viene stampato il campo nome del documento.
  • Il metodo __exit__ si occupa di chiudere la connessione all’uscita dal blocco with(operazione di teardown).
Tag articolo: