#python
#python
Вопрос:
Предыстория
Я написал конечный автомат, как показано ниже, следуя этим документам.
Состояния реализованы и показаны.
## Base Class.
class State:
def __init__(self,host='10.90.51.177'):
self.host = host
self.s = winrm.Session(host, auth=('user', 'pass'))
self.grpc_channel = grpc.insecure_channel(f"{host}:50051")
self.stub = my_grpc_lib.MyServiceStub(self.grpc_channel)
class Connecting(State):
def run(self):
# calls using winrm session
self.s.do_thing()
# calls using gprc_channel
self.stub.do_thing()
def next(self):
return Ready(self.host)
class Ready(State):
def next(self):
print('In State Ready')
Конечный автомат реализован, как показано.
class GameStateMachine:
def start(host):
state = Connecting(host=host)
while str(state) != "Ready":
print(f"[StateMachine] - Entering state {state}")
state.run()
state = state.next()
state = state.next()
В конечном итоге я повторяю приведенный ниже фрагмент 1000 раз в run.py
GameStateMachine.start(host="192.168.2.4")
Вопросы..
Главный вопрос, который у меня есть, заключается в следующем… Когда собирается мусор объектов сеанса?Я создаю тысячи сеансов, которые лежат вокруг открытых сокетов?
И это приводит меня к еще нескольким вопросам…
- Я воссоздаю несколько сеансов каждый раз, когда возвращаю (и, следовательно, создаю экземпляр)
State
объекта, или они очищаются с помощью какой-либо внешней сборки мусора? - Как я могу правильно использовать отладчик, чтобы получить представление о том, сколько объектов или сеансов у меня есть в стеке? Мне было трудно показать полный «стек объектов», чтобы самостоятельно устранить неполадки.
В конечном счете, было бы лучше для меня создать экземпляр сеанса grpc_channel
and winrm
вне моего конечного автомата?
Ответ №1:
У объектов Python есть метод __del__
, который вызывается, когда объект собирает мусор. Вы можете использовать его, чтобы определить, когда объект удаляется.
Как правило, если объект использует внешний ресурс (файл, базу данных, сокет и т. Д.), Обычно лучше закрыть этот ресурс явно, если вы можете.