GeeksforGeeks
Gerenciando recursos: em qualquer linguagem de programação, o uso de recursos como operações de arquivos ou conexões de banco de dados é muito comum. Mas estes recursos são limitados na oferta. Portanto, o principal problema está em assegurar-se de liberar esses recursos após o uso. Se eles não são liberados, então ele vai levar a fuga de recursos e pode fazer com que o sistema para tanto abrandar ou cair. Seria muito útil se o usuário tivesse um mecanismo para a configuração automática e variedade de recursos.Em Python, ele pode ser alcançado através do uso de gerenciadores de contexto que facilitam o manuseio adequado de recursos. A forma mais comum de realizar operações de arquivos é usando a palavra-chave com como mostrado abaixo:
with
open
(
"test.txt"
) as f:
data
=
f.read()
Let’s take the example of file gestao. Quando um arquivo é aberto, um descritor de arquivo é consumido que é um recurso limitado. Apenas um certo número de arquivos pode ser aberto por um processo de cada vez. O programa seguinte demonstra-o.
file_descriptors
=
for
x
in
range
(
100000
):
file_descriptors.append(
open
(
'test.txt'
,
'w'
))
Resultado:
Traceback (most recent call last): File "context.py", line 3, in OSError: Too many open files: 'test.txt'
Uma mensagem de erro dizendo que há muitos arquivos abertos. O exemplo acima é um caso de fuga de descritor de arquivo. Isso acontece porque há muitos arquivos abertos e eles não estão fechados. Pode haver chances de um programador se esquecer de fechar um arquivo aberto.Gestão de recursos utilizando o Gestor de contexto :
suponha que um bloco de código levanta uma exceção ou se ele tem um algoritmo complexo com múltiplos caminhos de retorno, torna-se complicado para fechar um arquivo em todos os lugares.
geralmente em outras línguas quando se trabalha com arquivos tentar-exceto-Finalmente é usado para garantir que o recurso de arquivo é fechado após o uso, mesmo que haja uma exceção.Python oferece uma maneira fácil de gerenciar recursos: gerentes de contexto. A palavra-chave com é usada. Quando ele é avaliado deve resultar em um objeto que executa a gestão de contexto. Os gerentes de contexto podem ser escritos usando classes ou funções(com decoradores).
criar um Gestor de contexto :
ao criar gestores de contexto usando classes, o utilizador precisa de assegurar que a classe tem os métodos: __enter__() e __sair__(). O _ _ _ enter__ () devolve o recurso que precisa de ser gerido e o __exit__ _ () não devolve nada, mas executa as operações de limpeza.em primeiro lugar, vamos criar uma classe simples chamada ContextManager para entender a estrutura básica de criar gerentes de contexto usando classes, como mostrado abaixo:
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
neste caso, um objeto ContextManager é criado. Isto é atribuído à variável a seguir à palavra-chave I. E. manager. Sobre a execução do programa acima, as seguintes são executados em seqüência:
- __init__()
- __introduza__()
- instrução do corpo (código dentro do bloco)
- __sair__()
gerenciamento de arquivos utilizando o gestor de contexto :
Vamos aplicar o conceito acima para criar uma classe que ajuda no ficheiro de gestão de recursos.A classe FileManager ajuda a abrir um arquivo, escrevendo/lendo conteúdo e, em seguida, fechá-lo.
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)
Saída:
True
gerenciamento de arquivos usando o context manager e com a declaração :
Em execução com o bloco, as seguintes operações acontecem em seqüência:
- Um FileManager objeto é criado com o teste.txt como o nome do ficheiro e w (write) como o modo quando __init__ método é executado.
- o método _enter __ Abre o teste.txt file in write mode (setup operation) and returns the FileManager object to variable F.
- the text ‘Test’ is written into the file.
- o método _ _ exit_ _ tem o cuidado de fechar o ficheiro ao sair do bloco com(operação “teardown”).
Quando a impressão (F. closed) é executada, a saída é verdadeira, uma vez que o Gestor de Ficheiros já teve o cuidado de fechar o ficheiro que de outra forma precisava ser feito explicitamente.
gerenciamento de conexão de banco de dados usando o Gerenciador de contexto:
vamos criar um sistema simples de gerenciamento de conexão de banco de dados. O número de conexões de banco de dados que podem ser abertas em um momento também é limitado(assim como descritores de arquivo). Portanto, os gerentes de contexto são úteis na gestão de conexões para o banco de dados, pois pode haver chances de que o programador se esqueça de fechar a conexão.
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'
))
conexão de Banco de dados de gerenciamento usando o context manager e com a declaração :
Em execução com o bloco, as seguintes operações acontecem em sequência:
- Um MongoDBConnectionManager objeto é criado com localhost como o hostnamename e 27017 como a porta quando __init__ método é executado.
- o método _ _ enter_ _ abre a ligação mongodb e devolve o objecto MongoDBConnectionManager à variável mongo.
- a colecção de testes na Base de dados Sampldb é acedida e o documento com _id=1 é recuperado. O campo Nome do documento é impresso.
- o método _ _ exit_ _ tem o cuidado de fechar a ligação ao sair do bloco com(operação “teardown”).Etiquetas para artigos: