GeeksforGeeks
gestionarea resurselor : în orice limbaj de programare, utilizarea resurselor precum operațiunile de fișiere sau conexiunile bazei de date este foarte frecventă. Dar aceste resurse sunt limitate în aprovizionare. Prin urmare, principala problemă constă în asigurarea eliberării acestor resurse după utilizare. Dacă acestea nu sunt eliberate, atunci aceasta va duce la scurgeri de resurse și poate provoca sistemul să încetinească sau accident. Ar fi foarte util dacă utilizatorul au un mecanism pentru configurarea automată și teardown de resurse.În Python, se poate realiza prin utilizarea managerilor de context care facilitează manipularea corectă a resurselor. Cel mai comun mod de a efectua operațiuni de fișiere este prin utilizarea cu cuvinte cheie așa cum se arată mai jos:
with
open
(
"test.txt"
) as f:
data
=
f.read()
Let’s take the example of file management. Când un fișier este deschis, un descriptor de fișier este consumat, care este o resursă limitată. Doar un anumit număr de fișiere pot fi deschise printr-un proces la un moment dat. Următorul program o demonstrează.
file_descriptors
=
for
x
in
range
(
100000
):
file_descriptors.append(
open
(
'test.txt'
,
'w'
))
ieșire:
Traceback (most recent call last): File "context.py", line 3, in OSError: Too many open files: 'test.txt'
un mesaj de eroare care spune că prea multe fișiere sunt deschise. Exemplul de mai sus este un caz de scurgere a descriptorului de fișiere. Se întâmplă deoarece există prea multe fișiere deschise și nu sunt închise. S-ar putea să existe șanse ca un programator să uite să închidă un fișier deschis.
gestionarea resurselor folosind managerul de context :
Să presupunem că un bloc de cod ridică o excepție sau dacă are un algoritm complex cu mai multe căi de întoarcere, devine greoaie închiderea unui fișier în toate locurile.
În general, în alte limbi, atunci când se lucrează cu fișiere încerca-cu excepția-în cele din urmă este utilizat pentru a se asigura că resursa de fișier este închis după utilizare, chiar dacă există o excepție.Python oferă o modalitate ușoară de a gestiona resursele: managerii de Context. Cuvântul cheie cu este utilizat. Când este evaluat, ar trebui să aibă ca rezultat un obiect care efectuează gestionarea contextului. Managerii de Context pot fi scrise folosind clase sau funcții(cu decoratori).
crearea unui manager de Context:
când creați manageri de context folosind clase, utilizatorul trebuie să se asigure că clasa are metodele: __enter__() și __exit__(). _ _ Enter _ _ () returnează resursa care trebuie gestionată și __exit__ () nu returnează nimic, dar efectuează operațiunile de curățare.
În primul rând, vă permite să creați o clasă simplu numit ContextManager pentru a înțelege structura de bază a crea manageri de context, folosind clase, așa cum se arată mai jos:
class
ContextManager():
def
__init__(
self
):
print
(
'init method called'
)
def
__enter__(
self
):
print
(
'enter method called'
)
return
self
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
În acest caz este creat un obiect ContextManager. Aceasta este atribuită variabilei după managerul as keyword adică. La rularea programului de mai sus, următoarele se execută în ordine:
- __init__()
- __enter__()
- corp declarație (cod în interiorul cu bloc)
- __exit__()
File management folosind context manager :
să aplice conceptul de mai sus pentru a crea o clasă care ajută la gestionarea resurselor de fișiere.Clasa FileManager ajută la deschiderea unui fișier, scrierea / citirea conținutului și apoi închiderea acestuia.
class
FileManager():
def
__init__(
self
, filename, mode):
self
.filename
=
filename
self
.mode
=
mode
self
.
file
=
None
def
__enter__(
self
):
self
.
file
=
open
(
self
.filename,
self
.mode)
return
self
.
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)
ieșire:
True
gestionarea fișierelor folosind managerul de context și cu declarația:
la executarea blocului cu, următoarele operații se întâmplă în ordine:
- un obiect FileManager este creat cu test.txt ca nume de fișier și w (scriere) ca mod când metoda __init__ este executată.
- metoda __enter__ deschide testul.fișier txt în modul de scriere (operație de configurare) și returnează obiectul FileManager la variabila f.
- textul ‘Test’ este scris în fișier.
- metoda __exit__ are grijă de închiderea fișierului la ieșirea din blocul cu(operațiunea teardown).
când se execută print(F.closed), ieșirea este adevărată, deoarece FileManager a avut deja grijă să închidă fișierul care altfel trebuia făcut în mod explicit.
gestionarea conexiunii bazei de date folosind managerul de context:
să creăm un sistem simplu de gestionare a conexiunii bazei de date. Numărul de conexiuni de baze de date care pot fi deschise la un moment dat este, de asemenea, limitat(la fel ca descriptorii de fișiere). Prin urmare, managerii de context sunt utili în gestionarea conexiunilor la baza de date, deoarece ar putea exista șanse ca programatorul să uite să închidă conexiunea.
from
pymongo
import
MongoClient
class
MongoDBConnectionManager():
def
__init__(
self
, hostname, port):
self
.hostname
=
hostname
self
.port
=
port
self
.connection
=
None
def
__enter__(
self
):
self
.connection
=
MongoClient(
self
.hostname,
self
.port)
return
self
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'
))
gestionarea conexiunii bazei de date folosind managerul de context și cu instrucțiunea:
la executarea blocului cu, următoarele operații se întâmplă în ordine:
- un obiect mongodbconnectionmanager este creat cu localhost ca hostnamename și 27017 ca port când metoda __init__ este executată.
- metoda __enter__ deschide conexiunea mongodb și returnează obiectul MongoDBConnectionManager la mongo variabilă.
- colecția de testare din Baza de date SampleDb este accesată și documentul cu _id=1 este preluat. Câmpul Nume al documentului este tipărit.
- metoda __exit__ are grijă de închiderea conexiunii la ieșirea din blocul cu(operațiunea teardown).