From c5c6a51cd259b143a213e51bd0e0e5f1e6f4c0d7 Mon Sep 17 00:00:00 2001 From: deadzilla Date: Sat, 11 Jul 2026 23:30:55 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20requests.Session=20=D0=BF=D1=80=D0=B8=20graceful=20shu?= =?UTF-8?q?tdown=20=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 6 +++++- utils/__init__.py | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/bot.py b/bot.py index fd51c3d..e6706cd 100644 --- a/bot.py +++ b/bot.py @@ -175,10 +175,14 @@ class BotRunner: pass # Бот не может писать в канал — игнорируем def _on_shutdown(self) -> None: - """Остановить планировщик при завершении работы бота.""" + """Остановить планировщик и закрыть сетевые сессии.""" if self.scheduler: self.scheduler.stop() logger.info("Планировщик остановлен") + from utils import close_all_sessions + + close_all_sessions() + logger.info("Сетевые сессии закрыты") async def _on_shutdown_async(self) -> None: """Асинхронный хук завершения (discord.py on_shutdown).""" diff --git a/utils/__init__.py b/utils/__init__.py index 0f12141..4d68d36 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1,5 +1,6 @@ from .pogoda import ( API_URL_WEATHER, + _session as _weather_session, fetch_weather, fetch_open_meteo, format_weather_data_for_console, @@ -8,14 +9,18 @@ from .pogoda import ( translate_weather, wmo_to_russian, ) -from .news import ( +from .news import ( # noqa: E402 + _session as _news_session, RSS_URL_ARTICLES, RSS_URL_POSTS, fetch_rss, format_articles, truncate_title, ) -from .cat import fetch_cat +from .cat import ( # noqa: E402 + _session as _cat_session, + fetch_cat, +) __all__ = [ # Погода @@ -35,4 +40,20 @@ __all__ = [ "truncate_title", # Котики "fetch_cat", + # Lifecycle + "close_all_sessions", ] + + +def close_all_sessions() -> None: + """Закрыть все requests.Session для освобождения сокетов.""" + for session in ( + _weather_session, + _news_session, + _cat_session, + ): + try: + session.close() + except Exception: + pass # Cleanup — игнорируем ошибки +