From c103fa700ef373491b1f1ee2ca9139eefb67359e Mon Sep 17 00:00:00 2001 From: zerone Date: Mon, 24 Feb 2025 21:05:49 +0800 Subject: [PATCH] add --- src/server.py | 62 +++++++-------------------------------------------- 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/src/server.py b/src/server.py index cad9811..09a2c27 100644 --- a/src/server.py +++ b/src/server.py @@ -1,4 +1,5 @@ import asyncio +import platform from typing import Any, Dict, List import ccxt.async_support as ccxt import mcp.types as types @@ -6,9 +7,10 @@ from mcp.server import Server, NotificationOptions from mcp.server.models import InitializationOptions import mcp.server.stdio from datetime import datetime, timedelta -import sys -import platform -import signal + +# Windows平台特定的事件循环策略设置 +if platform.system() == 'Windows': + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) # 初始化服务器 server = Server("crypto-server") @@ -425,58 +427,10 @@ async def main(): ) -def handle_sigint(): - """Handle keyboard interrupt""" - for instance in exchange_instances.values(): - asyncio.create_task(instance.close()) - sys.exit(0) - -def configure_asyncio_event_loop(): - """Configure the appropriate event loop based on the platform""" - if platform.system() == 'Windows': - # Windows specific configuration for aiodns compatibility - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - else: - # Unix-like systems configuration - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - # Set up signal handlers - try: - if platform.system() != 'Windows': - # Unix-like systems support these signals - loop.add_signal_handler(signal.SIGINT, handle_sigint) - loop.add_signal_handler(signal.SIGTERM, handle_sigint) - else: - # Windows alternative - signal.signal(signal.SIGINT, lambda x, y: handle_sigint()) - except NotImplementedError: - # Fallback for environments where signals are not supported - pass - - return loop - def run_server(): - """Wrapper to run the async main function with proper event loop configuration""" - try: - loop = configure_asyncio_event_loop() - loop.run_until_complete(main()) - except KeyboardInterrupt: - handle_sigint() - finally: - try: - # Clean up pending tasks - pending = asyncio.all_tasks(loop) - for task in pending: - task.cancel() - # Give tasks a chance to clean up - if pending: - loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True)) - finally: - loop.close() + """Wrapper to run the async main function""" + asyncio.run(main()) if __name__ == "__main__": - run_server() + asyncio.run(main())