This commit is contained in:
zerone 2025-02-24 21:05:49 +08:00
parent 9eff208e8e
commit c103fa700e

View File

@ -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())