From 613e1b96cd2d2b404d6ea25aa3d22f723239addf Mon Sep 17 00:00:00 2001 From: Alexey Polyakov Date: Wed, 6 May 2026 15:25:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20sigterm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.py | 21 +++++++++++++++++++-- src/oneme/websocket.py | 8 +++++++- src/tamtam/websocket.py | 8 +++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main.py b/src/main.py index 4e6617d..5051507 100644 --- a/src/main.py +++ b/src/main.py @@ -1,7 +1,9 @@ # Импортирование библиотек import asyncio import logging +import signal import ssl +import sys from common.config import ServerConfig from common.push import PushService @@ -175,10 +177,25 @@ async def main(): api["telegram_bot"] = controllers["telegrambot"] - tasks = [controller.launch(api) for controller in controllers.values()] + coros = [controller.launch(api) for controller in controllers.values()] + running_tasks = [asyncio.create_task(coro) for coro in coros] + + # Обработчик sigterm + loop = asyncio.get_running_loop() + + def _shutdown(sig): + for task in running_tasks: + task.cancel() + + if sys.platform != "win32": + for sig in (signal.SIGTERM, signal.SIGINT): + loop.add_signal_handler(sig, _shutdown, sig) # Запускаем контроллеры - await asyncio.gather(*tasks) + try: + await asyncio.gather(*running_tasks) + except asyncio.CancelledError: + logging.info("Все задачи завершены, выходим") if __name__ == "__main__": diff --git a/src/oneme/websocket.py b/src/oneme/websocket.py index 693878c..8113216 100644 --- a/src/oneme/websocket.py +++ b/src/oneme/websocket.py @@ -2,6 +2,7 @@ import logging import time import traceback import websockets +import asyncio from common.proto_web import WebProto from oneme.processors import Processors from common.rate_limiter import RateLimiter @@ -410,4 +411,9 @@ class OnemeWS: self.logger.info(f"WebSocket запущен на порту {self.port}") - await self.server.wait_closed() \ No newline at end of file + try: + await self.server.wait_closed() + except asyncio.CancelledError: + self.server.close() + await self.server.wait_closed() + raise \ No newline at end of file diff --git a/src/tamtam/websocket.py b/src/tamtam/websocket.py index 8c419d3..fd91888 100644 --- a/src/tamtam/websocket.py +++ b/src/tamtam/websocket.py @@ -1,6 +1,7 @@ import logging import traceback import websockets +import asyncio from common.proto_web import WebProto from tamtam.processors import Processors from common.rate_limiter import RateLimiter @@ -229,4 +230,9 @@ class TamTamWS: self.logger.info(f"TT WebSocket запущен на порту {self.port}") - await self.server.wait_closed() \ No newline at end of file + try: + await self.server.wait_closed() + except asyncio.CancelledError: + self.server.close() + await self.server.wait_closed() + raise \ No newline at end of file