38 lines
1.1 KiB
Python
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()
|