Use Hypercorn for republisher serve
This commit is contained in:
parent
73617cd40c
commit
c04efeb189
7 changed files with 133 additions and 9 deletions
|
|
@ -1,12 +1,18 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import logging
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
from contextlib import suppress
|
||||
|
||||
from hypercorn.asyncio import serve as hypercorn_serve
|
||||
from hypercorn.config import Config as HypercornConfig
|
||||
|
||||
import repub.crawl as crawl_module
|
||||
from repub.web import create_app
|
||||
from repub.web import SHUTDOWN_EVENT_KEY, create_app
|
||||
|
||||
FeedNameFilter = crawl_module.FeedNameFilter
|
||||
check_runtime = crawl_module.check_runtime
|
||||
|
|
@ -67,6 +73,42 @@ def parse_args(argv: list[str] | None = None) -> tuple[str, argparse.Namespace]:
|
|||
return command, args
|
||||
|
||||
|
||||
def _install_signal_handlers(stop_event: asyncio.Event) -> None:
|
||||
loop = asyncio.get_running_loop()
|
||||
|
||||
def request_stop(*_: object) -> None:
|
||||
if not stop_event.is_set():
|
||||
stop_event.set()
|
||||
|
||||
for signum in (signal.SIGINT, signal.SIGTERM):
|
||||
try:
|
||||
loop.add_signal_handler(signum, request_stop)
|
||||
except NotImplementedError:
|
||||
signal.signal(signum, request_stop)
|
||||
|
||||
|
||||
async def _serve_app(*, host: str, port: int, dev_mode: bool) -> None:
|
||||
stop_event = asyncio.Event()
|
||||
_install_signal_handlers(stop_event)
|
||||
|
||||
app = create_app(dev_mode=dev_mode)
|
||||
app.extensions[SHUTDOWN_EVENT_KEY] = stop_event
|
||||
|
||||
config = HypercornConfig()
|
||||
config.bind = [f"{host}:{port}"]
|
||||
config.use_reloader = False
|
||||
config.accesslog = "-"
|
||||
config.errorlog = "-"
|
||||
|
||||
async def shutdown_trigger() -> None:
|
||||
await stop_event.wait()
|
||||
|
||||
try:
|
||||
await hypercorn_serve(app, config, shutdown_trigger=shutdown_trigger)
|
||||
finally:
|
||||
stop_event.set()
|
||||
|
||||
|
||||
def entrypoint(argv: list[str] | None = None) -> int:
|
||||
command, args = parse_args(argv)
|
||||
|
||||
|
|
@ -80,8 +122,8 @@ def entrypoint(argv: list[str] | None = None) -> int:
|
|||
logger.error("Invalid REPUBLISHER_PORT/--port value: %s", args.port)
|
||||
return 2
|
||||
|
||||
app = create_app(dev_mode=bool(args.dev_mode))
|
||||
app.run(host=args.host, port=port)
|
||||
with suppress(KeyboardInterrupt):
|
||||
asyncio.run(_serve_app(host=args.host, port=port, dev_mode=bool(args.dev_mode)))
|
||||
return 0
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue