Как я могу отслеживать создание / удаление объекта и сборку мусора в python?

#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__ , который вызывается, когда объект собирает мусор. Вы можете использовать его, чтобы определить, когда объект удаляется.

Как правило, если объект использует внешний ресурс (файл, базу данных, сокет и т. Д.), Обычно лучше закрыть этот ресурс явно, если вы можете.