43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
import asyncio
|
|
import signal
|
|
from typing import Any
|
|
|
|
import uvicorn
|
|
from fastapi import FastAPI
|
|
|
|
from vllm.logger import init_logger
|
|
|
|
logger = init_logger(__name__)
|
|
|
|
|
|
async def serve_http(app: FastAPI, **uvicorn_kwargs: Any) -> None:
|
|
logger.info("Available routes are:")
|
|
for route in app.routes:
|
|
methods = getattr(route, "methods", None)
|
|
path = getattr(route, "path", None)
|
|
|
|
if methods is None or path is None:
|
|
continue
|
|
|
|
logger.info("Route: %s, Methods: %s", path, ', '.join(methods))
|
|
|
|
config = uvicorn.Config(app, **uvicorn_kwargs)
|
|
server = uvicorn.Server(config)
|
|
|
|
loop = asyncio.get_running_loop()
|
|
|
|
server_task = loop.create_task(server.serve())
|
|
|
|
def signal_handler() -> None:
|
|
# prevents the uvicorn signal handler to exit early
|
|
server_task.cancel()
|
|
|
|
loop.add_signal_handler(signal.SIGINT, signal_handler)
|
|
loop.add_signal_handler(signal.SIGTERM, signal_handler)
|
|
|
|
try:
|
|
await server_task
|
|
except asyncio.CancelledError:
|
|
logger.info("Gracefully stopping http server")
|
|
await server.shutdown()
|