Articles

GeeksforGeeks

Správa zdrojů: v jakémkoli programovacím jazyce je použití zdrojů, jako jsou operace se soubory nebo připojení k databázi, velmi běžné. Ale tyto zdroje jsou omezené v nabídce. Hlavní problém proto spočívá v zajištění uvolnění těchto zdrojů po použití. Pokud nejsou uvolněny, povede to k úniku zdrojů a může způsobit zpomalení nebo selhání systému. Bylo by velmi užitečné, kdyby uživatel mít mechanismus pro automatické nastavení a teardown zdrojů.V Pythonu to lze dosáhnout použitím kontextových manažerů, které usnadňují správné zacházení se zdroji. Nejběžnějším způsobem provádění operací se soubory je použití klíčového slova s, jak je uvedeno níže:

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



Let’s take the example of file řízení. Když je soubor otevřen, je spotřebován deskriptor souboru, což je omezený zdroj. Pouze určitý počet souborů lze otevřít procesem najednou. Následující program to demonstruje.

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



Výstup:

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

chybové hlášení říká, že je otevřeno příliš mnoho souborů. Výše uvedený příklad je případ úniku deskriptoru souboru. Stává se to proto, že existuje příliš mnoho otevřených souborů a nejsou uzavřeny. Mohou existovat šance, kdy programátor zapomene zavřít otevřený soubor.

Správa zdrojů pomocí context Manageru :

Předpokládejme, že blok kódu vyvolá výjimku nebo pokud má složitý algoritmus s více návratovými cestami, je obtížné zavřít soubor na všech místech.
obecně v jiných jazycích při práci se soubory zkuste-s výjimkou-nakonec se používá k zajištění, že prostředek souboru je po použití uzavřen, i když existuje výjimka.Python poskytuje snadný způsob správy zdrojů: kontextové manažery. Používá se Klíčové slovo s. Když se vyhodnotí, mělo by to mít za následek objekt, který provádí správu kontextu. Kontextové manažery lze psát pomocí tříd nebo funkcí (s dekoratéry).

Vytvoření Kontextu Správce :

Při vytváření kontextu manažeři pomocí tříd, uživatel musí zajistit, že třída má metody: __enter__() a __exit__(). __ Enter_ _ () vrátí zdroj, který je třeba spravovat, a__ exit _ _ () nevrátí nic, ale provede operace vyčištění.
za Prvé, umožňuje vytvořit jednoduchou třídu s názvem ContextManager pochopit základní strukturu vytváří kontext manažeři pomocí tříd, jak je uvedeno níže:

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

v tomto případě je vytvořen objekt ContextManager. Toto je přiřazeno proměnné za klíčovým slovem as, tj. Na spuštění výše uvedený program, následující se provádí v pořadí:

  • __init__()
  • __enter__()
  • prohlášení tělo (kód uvnitř bloku)
  • __exit__()

správa Souborů pomocí kontextové správce :

Pojďme použít výše uvedené koncepce vytvořit třídu, která pomáhá v souboru resource management.Třída FileManager pomáhá při otevírání souboru, psaní / čtení obsahu a jeho zavření.

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)



Výstup:

True

správa Souborů pomocí kontextové správce a s prohlášením :

Na spuštění bloku, tyto operace se dějí v pořadí:

  • FileManager je vytvořen objekt s test.txt jako název souboru a w (write)jako režim při spuštění metody __init__.
  • metoda _ _ enter _ _ otevře test.txt soubor v režimu zápisu (operace nastavení) a vrátí objekt FileManager do proměnné f.
  • text ‚Test‘ je zapsán do souboru.
  • metoda _ _ exit_ _ se stará o zavření souboru při ukončení bloku s (operace roztržení).
    Při tisku(f.uzavřené), výstup je True jako FileManager již postará o zavření souboru, který by bylo jinak nutné být explicitně provedeno.

Správa databázového připojení pomocí context manager:

Vytvořme jednoduchý systém správy databázového připojení. Počet databázových připojení, která lze otevřít najednou, je také omezený(stejně jako deskriptory souborů). Proto jsou správci kontextu nápomocní při správě připojení k databázi, protože může existovat šance, že programátor zapomene připojení zavřít.

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



připojení Databáze správy pomocí kontextové správce a s prohlášením :

Na spuštění bloku, tyto operace se dějí v pořadí:

  • MongoDBConnectionManager objekt je vytvořen pomocí localhost jako hostnamename a 27017 jako port, když __init__ metoda je popraven.
  • metoda _ _ enter _ _ otevře připojení mongodb a vrátí objekt MongoDBConnectionManager proměnné mongo.
  • je přístupná kolekce testů v databázi SampleDb a je načten dokument s _id=1. Vytiskne se pole s názvem dokumentu.
  • metoda _ _ exit__ se stará o uzavření spojení při ukončení bloku s (operace roztržení).
článek značky: