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
=
for
x
in
range
(
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:
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
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__()
- utasítás törzse (kód a blokk belsejében)
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.
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)
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.
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'
))
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).