assistant/scripts/serve.py

38 lines
1.1 KiB
Python

"""Project-owned Uvicorn launcher with a parent-process control pipe.
Closing stdin requests a normal lifespan shutdown on Windows and macOS alike.
There is no HTTP shutdown endpoint and no lookup of unrelated processes.
"""
from __future__ import annotations
import argparse
import os
import sys
import threading
import uvicorn
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--port", type=int, default=8810)
args = parser.parse_args()
server = uvicorn.Server(uvicorn.Config("apps.server.main:app", host="127.0.0.1", port=args.port,
timeout_graceful_shutdown=8))
def watch_parent() -> None:
try:
# os.read avoids a daemon thread holding Python's buffered stdin lock
# during interpreter shutdown. Any parent message or EOF means stop.
os.read(sys.stdin.fileno(), 1024)
except OSError:
pass
server.should_exit = True
threading.Thread(target=watch_parent, name="assistant-parent-pipe", daemon=True).start()
server.run()
if __name__ == "__main__":
main()