GeeksforGeeks
Administrere Ressurser: i et hvilket som helst programmeringsspråk er bruken av ressurser som filoperasjoner eller databaseforbindelser svært vanlig. Men disse ressursene er begrenset i tilbudet. Derfor ligger hovedproblemet i å sørge for å frigjøre disse ressursene etter bruk. Hvis de ikke blir utgitt, vil det føre til ressurslekkasje og kan føre til at systemet enten senker eller krasjer. Det ville være svært nyttig hvis brukeren har en mekanisme for automatisk oppsett og teardown av ressurser.I Python kan Det oppnås ved bruk av kontekstledere som letter riktig håndtering av ressurser. Den vanligste måten å utføre filoperasjoner på er å bruke med-søkeordet som vist nedenfor:
with
open
(
"test.txt"
) as f:
data
=
f.read()
Let’s take the example of file Management. Når en fil åpnes, forbrukes en filbeskrivelse som er en begrenset ressurs. Bare et visst antall filer kan åpnes av en prosess om gangen. Følgende program demonstrerer det.
file_descriptors
=
for
x
in
range
(
100000
):
file_descriptors.append(
open
(
'test.txt'
,
'w'
))
output:
Traceback (most recent call last): File "context.py", line 3, in OSError: Too many open files: 'test.txt'
en feilmelding som sier at for mange filer er åpne. Eksemplet ovenfor er et tilfelle av filbeskrivelseslekkasje. Det skjer fordi det er for mange åpne filer, og de er ikke stengt. Det kan være sjanser der en programmerer kan glemme å lukke en åpnet fil.
Administrere Ressurser ved hjelp av context manager :Anta at en blokk med kode gir et unntak, eller hvis det har en kompleks algoritme med flere returbaner, blir det tungvint å lukke en fil på alle steder.
generelt på andre språk når du arbeider med filer, prøv-unntatt-til slutt brukes til å sikre at filressursen er stengt etter bruk, selv om det er et unntak.Python gir en enkel måte å administrere ressurser: Kontekst Ledere. Nøkkelordet brukes. Når det blir evaluert, bør det resultere i et objekt som utfører kontekststyring. Kontekstledere kan skrives ved hjelp av klasser eller funksjoner (med dekoratører).
Opprette En Kontekstleder:
når du oppretter kontekstledere ved hjelp av klasser, må brukeren sørge for at klassen har metodene: __enter__() og __exit__(). _ _ Enter _ _ () returnerer ressursen som må administreres, og _ _ exit__ () returnerer ikke noe, men utfører oppryddingsoperasjoner.Først kan vi lage en enkel klasse kalt ContextManager for å forstå den grunnleggende strukturen for å skape kontekstledere ved hjelp av klasser, som vist nedenfor:
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
I dette tilfellet opprettes Et ContextManager-objekt. Dette tilordnes variabelen etter as-søkeordet, dvs. Når du kjører programmet ovenfor, blir følgende utført i rekkefølge:
- __init__()
Filbehandling ved hjelp av context manager:
la oss bruke konseptet ovenfor for å opprette en klasse som hjelper i fil ressursforvaltning.FileManager-klassen hjelper til med å åpne en fil, skrive / lese innhold og deretter lukke den.
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)
Output:
True
filbehandling ved hjelp av context manager og med setning:
når du utfører med-blokken, skjer følgende operasjoner i rekkefølge:
- et FileManager-objekt opprettes med test.txt som filnavn og w (write) som modus når__ init _ _ metoden utføres.
- metoden __enter _ _ åpner testen.txt-fil i skrivemodus(setup-operasjon) og returnerer filemanager-objektet til variabel f.
- teksten ‘Test’ er skrevet inn i filen.
- __exit__ metoden tar seg av å lukke filen på å avslutte med blokk (teardown operasjon).
når print(f.closed) kjøres, er utgangen Sant Som FileManager har allerede tatt vare på å lukke filen som ellers måtte eksplisitt gjort.
database connection management ved hjelp av context manager:
La oss lage en enkel database connection management system. Antall databaseforbindelser som kan åpnes om gangen, er også begrenset (akkurat som filbeskrivelser). Derfor kontekst ledere er nyttig i å håndtere tilkoblinger til databasen som det kan være sjanser for at programmerer kan glemme å lukke tilkoblingen.
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'
))
databaseforbindelsesbehandling ved hjelp av kontekstbehandling og med setning:
når du utfører med-blokken, skjer følgende operasjoner i rekkefølge:
- et mongodbconnectionmanager-objekt opprettes med localhost som hostnamename og 27017 som port når __init__ – metoden utføres.
- testsamlingen i sampledb-databasen åpnes og dokumentet med _id=1 hentes. Navn-feltet i dokumentet skrives ut.
- __exit__ – metoden tar seg av å lukke forbindelsen ved å avslutte med blokk (teardown-operasjon).