fix: добавлено закрытие requests.Session при graceful shutdown бота

This commit is contained in:
deadzilla 2026-07-11 23:30:55 +05:00
parent 1fa6deaf67
commit c5c6a51cd2
2 changed files with 28 additions and 3 deletions

6
bot.py
View File

@ -175,10 +175,14 @@ class BotRunner:
pass # Бот не может писать в канал — игнорируем pass # Бот не может писать в канал — игнорируем
def _on_shutdown(self) -> None: def _on_shutdown(self) -> None:
"""Остановить планировщик при завершении работы бота.""" """Остановить планировщик и закрыть сетевые сессии."""
if self.scheduler: if self.scheduler:
self.scheduler.stop() self.scheduler.stop()
logger.info("Планировщик остановлен") logger.info("Планировщик остановлен")
from utils import close_all_sessions
close_all_sessions()
logger.info("Сетевые сессии закрыты")
async def _on_shutdown_async(self) -> None: async def _on_shutdown_async(self) -> None:
"""Асинхронный хук завершения (discord.py on_shutdown).""" """Асинхронный хук завершения (discord.py on_shutdown)."""

View File

@ -1,5 +1,6 @@
from .pogoda import ( from .pogoda import (
API_URL_WEATHER, API_URL_WEATHER,
_session as _weather_session,
fetch_weather, fetch_weather,
fetch_open_meteo, fetch_open_meteo,
format_weather_data_for_console, format_weather_data_for_console,
@ -8,14 +9,18 @@ from .pogoda import (
translate_weather, translate_weather,
wmo_to_russian, wmo_to_russian,
) )
from .news import ( from .news import ( # noqa: E402
_session as _news_session,
RSS_URL_ARTICLES, RSS_URL_ARTICLES,
RSS_URL_POSTS, RSS_URL_POSTS,
fetch_rss, fetch_rss,
format_articles, format_articles,
truncate_title, truncate_title,
) )
from .cat import fetch_cat from .cat import ( # noqa: E402
_session as _cat_session,
fetch_cat,
)
__all__ = [ __all__ = [
# Погода # Погода
@ -35,4 +40,20 @@ __all__ = [
"truncate_title", "truncate_title",
# Котики # Котики
"fetch_cat", "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 — игнорируем ошибки