Articles

GeeksforGeeks

erőforrások kezelése: bármely programozási nyelvben az erőforrások, például a fájlműveletek vagy az adatbázis-kapcsolatok használata nagyon gyakori. De ezek az erőforrások korlátozottak a kínálatban. Ezért a fő probléma abban rejlik, hogy ezeket az erőforrásokat használat után felszabadítják. Ha nem kerülnek kiadásra, akkor az erőforrás-szivárgáshoz vezet, és a rendszer lelassulását vagy összeomlását okozhatja. Nagyon hasznos lenne, ha a felhasználó rendelkezik egy mechanizmussal az erőforrások automatikus beállításához és lebontásához.A Pythonban a kontextuskezelők használatával érhető el, amelyek megkönnyítik az erőforrások megfelelő kezelését. A fájlműveletek végrehajtásának leggyakoribb módja a with kulcsszó használata az alábbiak szerint:

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



Let’s take the example of file menedzsment. Egy fájl megnyitásakor egy fájlleíró kerül felhasználásra, amely korlátozott erőforrás. Csak egy bizonyos számú fájlt lehet megnyitni egy folyamat egy időben. A következő program bemutatja.

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



kimenet:

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

hibaüzenet, amely szerint túl sok fájl van megnyitva. A fenti példa a fájlleíró szivárgásának esete. Ez azért történik, mert túl sok nyitott fájl van, és nincsenek bezárva. Előfordulhat, hogy a programozó elfelejti bezárni a megnyitott fájlt.

erőforrások kezelése a context manager használatával :

tegyük fel, hogy egy kódblokk kivételt vet fel, vagy ha összetett algoritmusa van, több visszatérési útvonallal, nehézkessé válik egy fájl bezárása minden helyen.
általában más nyelveken, amikor dolgozik fájlokat try-kivéve-végül használják annak biztosítására, hogy a fájl erőforrás zárva használat után akkor is, ha van egy kivétel.A Python egyszerű módot kínál az erőforrások kezelésére: Kontextuskezelők. A with kulcsszót használják. Amikor kiértékelésre kerül, olyan objektumot kell eredményeznie, amely kontextuskezelést hajt végre. A kontextuskezelők osztályok vagy funkciók segítségével írhatók(dekorátorokkal).

Kontextuskezelő létrehozása:

a kontextuskezelők osztályokkal történő létrehozásakor a Felhasználónak biztosítania kell, hogy az osztály a következő módszerekkel rendelkezzen: __enter__() és __exit__(). A__ enter __() visszaadja a kezelendő erőforrást, a__ exit _ _ () pedig nem ad vissza semmit, hanem elvégzi a tisztítási műveleteket.
először is, lehetővé teszi, hogy hozzon létre egy egyszerű osztály nevű ContextManager megérteni az alapvető szerkezete létrehozása kontextus vezetők osztályok, az alábbiak szerint:

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

ebben az esetben egy ContextManager objektum jön létre. Ez a változóhoz az as kulcsszó, azaz a manager után van hozzárendelve. A fenti program futtatásakor a következőket hajtják végre egymás után:

  • __init__()
  • __enter__ ()
    • utasítás törzse (kód a blokk belsejében)
  • _exit __ ()
  • Fájlkezelés a context manager használatával:

    alkalmazzuk a fenti koncepciót ahhoz, hogy hozzon létre egy osztályt, amely segít a fájl erőforrás-kezelés.A FileManager osztály segít a fájl megnyitásában, a tartalom írásában/olvasásában, majd bezárásában.

    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)

    
    

    
    

    kimenet:

    True

    Fájlkezelés a context manager használatával és a következő utasításokkal:

    A with blokk végrehajtásakor a következő műveletek történnek egymás után:

    • egy FileManager objektum jön létre a test segítségével.a TXT fájlnév, A w (write) pedig a mód, amikor az __init__ metódus végrehajtásra kerül.
    • a __enter__ módszer megnyitja a tesztet.TXT fájl írási módban (beállítási művelet), és visszaadja a FileManager objektumot F változóra.
    • a ‘Test’ szöveg be van írva a fájlba.
    • a __exit__ metódus gondoskodik a fájl bezárásáról a blokkból való kilépéskor(lebontás művelet).
      amikor a print (F.closed) fut, a kimenet igaz, mivel a FileManager már gondoskodott a fájl bezárásáról, amelyet egyébként kifejezetten meg kellett tenni.

    adatbázis-kapcsolat kezelése a context manager használatával:

    hozzunk létre egy egyszerű adatbázis-kapcsolatkezelő rendszert. Az egyszerre megnyitható adatbázis-kapcsolatok száma szintén korlátozott (csakúgy, mint a fájlleírók). Ezért a kontextuskezelők hasznosak az adatbázishoz való kapcsolatok kezelésében, mivel előfordulhat, hogy a programozó elfelejti bezárni a kapcsolatot.

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

    
    

    
    

    adatbázis-kapcsolat kezelése a context Manager használatával és a következő utasításokkal:

    A with blokk végrehajtásakor a következő műveletek történnek egymás után:

    • egy mongodbconnectionmanager objektum jön létre a localhost mint a hostnamename és 27017 mint a port, amikor __init__ metódus kerül végrehajtásra.
    • a __enter__ metódus megnyitja a mongodb kapcsolatot, és visszaadja a MongoDBConnectionManager objektumot mongo változónak.
    • a tesztgyűjtemény a SampleDb adatbázisban érhető el, és a dokumentum a _id=1. A dokumentum név mezője kinyomtatásra kerül.
    • a __exit__ metódus gondoskodik a kapcsolat lezárásáról a blokkból való kilépéskor(leszakítási művelet).
    cikk címkék: