Articles

Geeksborgeeks

resurssien hallinta : missä tahansa ohjelmointikielessä resurssien, kuten tiedostotoimintojen tai tietokantayhteyksien käyttö on hyvin yleistä. Näillä resursseilla on kuitenkin rajallinen tarjonta. Siksi suurin ongelma on varmistaa vapauttaa nämä resurssit käytön jälkeen. Jos niitä ei vapauteta, se johtaa resurssivuotoon ja voi aiheuttaa järjestelmän joko hidastumisen tai kaatumisen. Olisi erittäin hyödyllistä, jos käyttäjä on mekanismi automaattisen asennuksen ja teardown resursseja.Pythonissa se voidaan saavuttaa käyttämällä kontekstinhallintaa, joka helpottaa resurssien asianmukaista käsittelyä. Yleisin tapa suorittaa tiedoston toiminnot on käyttämällä avainsanalla kuten alla:

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



Let’s take the example of file hallinta. Kun tiedosto avataan, tiedostokuvaaja kulutetaan, mikä on rajallinen resurssi. Prosessi voi avata vain tietyn määrän tiedostoja kerrallaan. Seuraava ohjelma osoittaa sen.

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



lähtö:

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

virheilmoitus, jonka mukaan liian monta tiedostoa on auki. Yllä olevassa esimerkissä on kyse tiedostokuvaajan vuodosta. Se tapahtuu, koska avoimia tiedostoja on liikaa ja niitä ei suljeta. Saattaa olla mahdollisuuksia, joissa ohjelmoija voi unohtaa sulkea avatun tiedoston.

resurssien hallinta kontekstinhallinnan avulla :

Oletetaan, että koodilohko aiheuttaa poikkeuksen tai jos siinä on monimutkainen algoritmi, jossa on useita paluupolkuja, käy hankalaksi sulkea tiedosto kaikissa paikoissa.
yleensä muissa kielissä tiedostojen kanssa työskenneltäessä try-except-finally-toimintoa käytetään varmistamaan, että tiedostoresurssi suljetaan käytön jälkeen, vaikka poikkeusta olisikin.Python tarjoaa helpon tavan hallita resursseja: Kontekstinhallinta. Käytetään with-avainsanaa. Kun se saa arvioidaan sen pitäisi johtaa objekti, joka suorittaa kontekstin hallinta. Context managerit voidaan kirjoittaa käyttäen luokkia tai funktioita(sisustajien kanssa).

luodaan Kontekstinhallinta:

luotaessa kontekstinhallintaa luokkia käyttäen käyttäjän on varmistettava, että luokalla on menetelmät: __enter__() ja __exit__(). _ _ Enter__ () palauttaa hallinnoitavan resurssin ja __exit__ () ei palauta mitään, vaan suorittaa puhdistustoiminnot.
ensinnäkin, lets create a simple class called ContextManager to understand the basic structure of creating context managers using classes, as shown below:

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

tällöin luodaan kontekstuaalinen olio. Tämä osoitetaan muuttujalle as-avainsanan eli managerin jälkeen. Yllä olevaa ohjelmaa suoritettaessa seuraava suoritetaan järjestyksessä:

  • __init__()
  • __enter__ ()
  • statement body (code inside the with block)
  • __exit__ ()
  • Tiedostonhallinta käyttäen context Manageria:

    sovelletaan yllä olevaa käsitettä luoda luokka, joka auttaa tiedostojen resurssinhallinnassa.FileManager-luokka auttaa tiedoston avaamisessa, sisällön kirjoittamisessa/lukemisessa ja sulkemisessa.

    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)

    
    

    
    

    Lähtö:

    True

    Tiedostonhallinta kontekstinhallinnan avulla ja lauseella :

    suoritettaessa blokkia seuraavat operaatiot tapahtuvat järjestyksessä:

    • FileManager-objekti luodaan testin avulla.txt tiedostonimenä ja w (write) tilana, kun __init__ menetelmä suoritetaan.
    • __enter__ – menetelmä avaa testin.txt-tiedosto kirjoitustilassa (määritysoperaatio) ja palauttaa FileManager-objektin muuttujalle f.
    • tiedostoon kirjoitetaan teksti ”testi”.
    • __exit__ – menetelmä huolehtii tiedoston sulkemisesta poistuttaessa with block(teardown-operaatio).
      kun tulostusta (F. suljettu) ajetaan, tuloste on tosi, sillä FileManager on jo huolehtinut tiedoston sulkemisesta, joka muuten olisi pitänyt eksplisiittisesti tehdä.

    tietokantayhteyksien hallinta kontekstinhallinnan avulla:

    luodaan yksinkertainen tietokantayhteyksien hallintajärjestelmä. Myös kerrallaan avattavien tietokantayhteyksien määrä on rajoitettu (aivan kuten tiedostokuvaajatkin). Siksi kontekstinhallinnasta on hyötyä tietokannan yhteyksien hallinnassa, sillä ohjelmoija saattaa unohtaa sulkea yhteyden.

    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'))

    div>

    
    
    
    

    tietokantayhteyksien hallinta kontekstinhallinnan avulla ja lauseella:

    suoritettaessa blokkia seuraavat operaatiot tapahtuvat järjestyksessä:

    • luodaan mongodbconnectionmanager-olio, jossa localhost on isäntänimi ja 27017 portti, kun __init__ menetelmä suoritetaan.
    • __enter__ – menetelmä avaa mongodb-yhteyden ja palauttaa MongoDBConnectionManager-objektin muuttujaan mongo.
    • SampleDb-tietokannan koekokoelma avataan ja _id=1-dokumentti noudetaan. Asiakirjan nimikenttä on painettu.
    • __exit__ menetelmä huolehtii yhteyden sulkemisesta poistuttaessa with block(teardown-toiminto).
    artiklan tagit: