Рекомендуемое управление ресурсами в Python - PullRequest
0 голосов
/ 06 января 2019

Я написал класс, который запускает сервер и управляет его ресурсами. Что-то вроде:

class Server:

  def __init__(self, ...):
    # create temporary directory 
    # initialize server conf files in temp dir
    ...

  def start(self, ...):
    # run server in a child process
    ...

  def terminate(self, ...):
    # kill server and clean up temp dir

У меня также есть скрипт, который проверяет мой сервер.

s = Server()
# send requests to server and check result
run_tests()
s.terminate()

Я хотел бы убедиться, что ресурсы, связанные с сервером, очищены в конце скрипта. Как таковой, terminate() не может быть вызван, если run_test() прерван из-за исключения или сигнала.

Я вижу несколько решений.

  1. вызов terminate из метода __del__. Но это потребовало бы искусственной ссылки для предотвращения GCed s, и я прочитал __del__ подверженный ошибкам.
  2. Перехват исключений и прерывание сигнала (в предложении finally), но это требует синтаксических издержек.
  3. используйте менеджер контекста, но мне может понадобиться использовать сервер (или несколько серверов) в разных местах кода, и он не будет хорошо работать с простыми with конструкциями.

Каково было бы рекомендуемое решение в этой ситуации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...