Articles

GeeksforGeeks

Zarządzanie zasobami: w każdym języku programowania bardzo powszechne jest użycie zasobów, takich jak operacje na plikach lub połączenia z bazą danych. Zasoby te są jednak ograniczone w podaży. Dlatego głównym problemem jest upewnienie się, że uwolnisz te zasoby po użyciu. Jeśli nie zostaną one wydane, doprowadzi to do wycieku zasobów i może spowodować spowolnienie systemu lub awarię. Byłoby bardzo pomocne, gdyby użytkownik miał mechanizm automatycznej konfiguracji i odrywania zasobów.W Pythonie można to osiągnąć poprzez użycie menedżerów kontekstu, które ułatwiają właściwą obsługę zasobów. Najczęstszym sposobem wykonywania operacji na plikach jest użycie słowa kluczowego with, jak pokazano poniżej:

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



Let’s take the example of file zarządzanie. Po otwarciu pliku używany jest deskryptor pliku, który jest ograniczonym zasobem. Proces może otworzyć tylko określoną liczbę plików naraz. Poniższy program to demonstruje.

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




wyjście:

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

komunikat o błędzie informujący, że zbyt wiele plików jest otwartych. Powyższy przykład dotyczy wycieku deskryptora pliku. Dzieje się tak, ponieważ jest zbyt wiele otwartych plików i nie są one zamknięte. Może być szansa, że programista zapomni zamknąć otwarty plik.

Zarządzanie zasobami za pomocą Menedżera kontekstu :

Załóżmy, że blok kodu wywołuje wyjątek lub jeśli ma złożony algorytm z wieloma ścieżkami powrotnymi, zamknięcie Pliku we wszystkich miejscach staje się uciążliwe.
ogólnie w innych językach podczas pracy z plikami try-except-finally jest używany do zapewnienia, że zasób pliku jest zamknięty po użyciu, nawet jeśli istnieje wyjątek.Python zapewnia łatwy sposób zarządzania zasobami: Menedżery kontekstu. Używane jest słowo kluczowe with. Gdy zostanie oceniony, powinien powstać obiekt, który wykonuje zarządzanie kontekstowe. Menedżery kontekstu mogą być pisane za pomocą klas lub funkcji (z dekoratorami).

Tworzenie Menedżera kontekstu:

podczas tworzenia menedżerów kontekstu za pomocą klas, użytkownik musi upewnić się, że klasa ma metody: __enter__() I __exit__(). _ _ Enter _ _ () zwraca zasób, którym należy zarządzać, a __exit__() nie zwraca niczego, ale wykonuje operacje czyszczenia.
Po pierwsze, stwórzmy prostą klasę o nazwie ContextManager, aby zrozumieć podstawową strukturę tworzenia menedżerów kontekstu za pomocą klas, jak pokazano poniżej:

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

w tym przypadku tworzony jest obiekt ContextManager. Jest to przypisane do zmiennej po słowie kluczowym as, czyli manager. Po uruchomieniu powyższego programu, następujące polecenie zostanie wykonane w kolejności:

  • _init __ ()
  • _ enter __()
  • treść instrukcji (kod wewnątrz bloku with)
  • _ exit_ _()

Zarządzanie plikami za pomocą Menedżera kontekstu :

zastosujmy powyższą koncepcję aby utworzyć klasę, która pomaga w zarządzaniu zasobami plików.Klasa FileManager pomaga w otwieraniu pliku, zapisywaniu/odczytywaniu zawartości, a następnie zamykaniu go.

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)



Wyjście:

True

Zarządzanie plikami za pomocą Menedżera kontekstu i z instrukcją :

Po wykonaniu bloku with następujące operacje następują kolejno:

  • obiekt FileManager jest tworzony za pomocą testu.txt jako nazwa pliku i w (write)jako tryb podczas wykonywania metody _ _ init__.
  • metoda __enter__ otwiera test.plik txt w trybie zapisu (operacja setup) i zwraca obiekt FileManager do zmiennej f.
  • do pliku zostanie zapisany tekst 'Test’.
  • metoda __exit__ dba o zamknięcie pliku przy wyjściu z bloku with(operacja teardown).
    gdy print(f.closed) jest uruchomiony, wyjście jest prawdziwe, ponieważ Menedżer plików już zadbał o zamknięcie pliku, co w przeciwnym razie musiało zostać jawnie wykonane.

zarządzanie połączeniem z bazą danych za pomocą Menedżera kontekstu:

stwórzmy prosty system zarządzania połączeniem z bazą danych. Liczba połączeń z bazą danych, które można otworzyć w danym czasie, jest również ograniczona (podobnie jak deskryptory plików). Dlatego Menedżery kontekstu są pomocne w zarządzaniu połączeniami z bazą danych, ponieważ mogą istnieć szanse, że programista zapomni zamknąć połączenie.

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

zarządzanie połączeniem z bazą danych za pomocą Menedżera kontekstu i instrukcji:

podczas wykonywania bloku with następują następujące operacje w kolejności::

  • obiekt mongodbconnectionmanager jest tworzony z localhost jako nazwą hosta i 27017 jako portem podczas wykonywania metody __INIT__.
  • metoda __enter__ otwiera połączenie mongodb i zwraca obiekt MongoDBConnectionManager do zmiennej mongo.
  • dostęp do kolekcji testowej w bazie danych SampleDb i pobierany jest dokument o _id=1. Drukowane jest pole nazwa dokumentu.
  • metoda __exit__ dba o zamknięcie połączenia przy wyjściu z bloku with(operacja teardown).
Tagi artykułu: