LINUX.ORG.RU

Как правильно сделать выход из потока?

 


0

1

Как правильно сделать выход из потока, включая нештатные ситуации?

Собственно надо чтобы всегда при выходе из потока выполнялись следующие методы:

self.cur.close()
self.conn.close()
self.conns_pool.putconn(conn)

Я знаю способ:

def first_method_of_class(self):
   try:
      self.hello_world()
   except Exception as err:
      traceback.print_exc()
      print(err)
   self.cur.close()
   self.conn.close()
   self.conns_pool.putconn(conn)

Но я хз насколько он корректен

Кстати, а в питоне можно исключение из одного потока как-то ловить в другом?

anonymous
()
Ответ на: комментарий от steemandlinux

То, что по логике приложения ты можешь закрывать ресурсы там, где их открывал, а ошибку ловить в другом месте

deadplace
()
Ответ на: комментарий от steemandlinux

Я хз. Может так:

    def run(self):
        pass
        self.__destructor()

    def __del__(self):
        self.__destructor()
    
    def __destructor(self):
        if self.conn:
            self.cur.close()
            self.conn.close()
            self.conns_pool.putconn(self.conn)
            self.conn = None

Только надо ссылку на объект удалить (если есть) и GC может не сразу прийти.

https://pynative.com/psycopg2-python-postgresql-connection-pooling/

РТК не открывает, заблокировано в РФ?

KillTheCat ★★★★★
()
Ответ на: комментарий от KillTheCat

Сожалеем, ресурс pynative.com (72.14.190.67) находится в списке заблокированных ресурсов на территории Российской Федерации!

Мдааа

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

Да уж, обколются своими экстремистскими сайтами, и в жопы по подворотням долбятся потом. Не надо провоцировать добропорядочных граждан.

anonymous
()
Ответ на: комментарий от steemandlinux

Вообще я бы не стал тут __del__ использовать, способ нормальный но если код выполняется в отдельном потоке то except не нужен:

def first_method_of_class(self):
   try:
      self.hello_world()
   finally:
      self.cur.close()
      self.conn.close()
      self.conns_pool.putconn(conn)
KillTheCat ★★★★★
()
Ответ на: комментарий от KillTheCat

except я юзаю из-за того, что у меня непредсказуемые входные данные, поэтому мне выхлоп с ошибками нужен.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от tz4678

Обычно except ловит не все ексепшоны, так что обычно finally имеет смысл. А вот except Exception таки да, встречается чуть чаще чем никогда, а когда таки встречается, finally там не особо нужен.

redixin ★★★★
()
Ответ на: комментарий от redixin

Что никогда не встречается, поскольку это ошибка синтаксиса или около того.

Конструкция выглядит примерно как

try:
  db.commit()
except Exception as e:
  db.rollback()
  raise e
finally:
  db.close()

хоть практически и не используется

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.