Я написал класс, который запускает сервер и управляет его ресурсами. Что-то вроде:
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()
прерван из-за исключения или сигнала.
Я вижу несколько решений.
- вызов
terminate
из метода __del__
. Но это потребовало бы искусственной ссылки для предотвращения GCed s
, и я прочитал __del__
подверженный ошибкам.
- Перехват исключений и прерывание сигнала (в предложении
finally
), но это требует синтаксических издержек.
- используйте менеджер контекста, но мне может понадобиться использовать сервер (или несколько серверов) в разных местах кода, и он не будет хорошо работать с простыми
with
конструкциями.
Каково было бы рекомендуемое решение в этой ситуации?