runner.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. """
  2. 服务器运行器:整合所有组件并启动 uvicorn。
  3. """
  4. import atexit
  5. import uvicorn
  6. from foundation.observability.logger.loggering import server_logger
  7. from server.signals import setup_signal_handlers
  8. class ServerRunner:
  9. """服务器运行器。"""
  10. def __init__(self, app_factory):
  11. self.app_factory = app_factory
  12. self.celery_manager = app_factory.celery_manager
  13. def run_server(self, **kwargs):
  14. config = self.app_factory.create_server_config()
  15. config.update(kwargs)
  16. host = config.get('host', '0.0.0.0')
  17. port = int(config.get('port', 8002))
  18. reload = config.get('reload', False)
  19. with_celery = config.get('with_celery', True)
  20. if with_celery:
  21. self.celery_manager.start_worker()
  22. atexit.register(self.celery_manager.stop_worker_immediately)
  23. setup_signal_handlers(lambda: self.celery_manager.stop_worker_immediately())
  24. app = self.app_factory.create_app()
  25. try:
  26. if reload:
  27. uvicorn.run("server.app:app", host=host, port=port, reload=reload)
  28. else:
  29. uvicorn.run(app, host=host, port=port)
  30. finally:
  31. if with_celery:
  32. self.celery_manager.stop_worker()