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