Articles

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 =
forx inrange(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:

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

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.

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)



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.

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



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: