Files
xiaozhi-esp32-server/main/xiaozhi-server/app.py
T

52 lines
1.5 KiB
Python
Raw Normal View History

2025-03-05 23:13:24 +08:00
import asyncio
2025-03-12 10:57:25 +08:00
import sys
import signal
2025-03-05 23:13:24 +08:00
from config.settings import load_config, check_config_file
from core.websocket_server import WebSocketServer
from core.utils.util import check_ffmpeg_installed
TAG = __name__
2025-03-12 10:57:25 +08:00
async def wait_for_exit():
"""Windows 和 Linux 兼容的退出监听"""
loop = asyncio.get_running_loop()
stop_event = asyncio.Event()
if sys.platform == "win32":
# Windows: 用 sys.stdin.read() 监听 Ctrl + C
await loop.run_in_executor(None, sys.stdin.read)
else:
# Linux/macOS: 用 signal 监听 Ctrl + C
def stop():
stop_event.set()
loop.add_signal_handler(signal.SIGINT, stop)
loop.add_signal_handler(signal.SIGTERM, stop) # 支持 kill 进程
await stop_event.wait()
2025-03-05 23:13:24 +08:00
async def main():
check_config_file()
check_ffmpeg_installed()
config = load_config()
# 启动 WebSocket 服务器
ws_server = WebSocketServer(config)
ws_task = asyncio.create_task(ws_server.start())
try:
2025-03-12 10:57:25 +08:00
await wait_for_exit() # 监听退出信号
except asyncio.CancelledError:
print("任务被取消,清理资源中...")
2025-03-05 23:13:24 +08:00
finally:
ws_task.cancel()
2025-03-12 10:57:25 +08:00
try:
await ws_task
except asyncio.CancelledError:
pass
print("服务器已关闭,程序退出。")
2025-03-05 23:13:24 +08:00
if __name__ == "__main__":
2025-03-12 10:57:25 +08:00
try:
asyncio.run(main())
except KeyboardInterrupt:
print("手动中断,程序终止。")