hack-house/.venv/lib/python3.12/site-packages/sanic/worker/restarter.py
leetcrypt bb1d662ee1 chore: rename project coven → hack-house ⛧
Rebrand the Rust client crate (coven/ → hh/, package+binary "hack-house"),
README, CLI strings, and branch (coven → hack-house). Gitea repo renamed
cmd-chat → hack-house to match. Crypto/server logic unchanged; selftest +
golden-vector test still green, binary is now `hack-house`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 13:29:14 -07:00

91 lines
3.0 KiB
Python

from __future__ import annotations
from sanic.log import error_logger
from sanic.worker.constants import RestartOrder
from sanic.worker.process import ProcessState, WorkerProcess
class Restarter:
def restart(
self,
transient_processes: list[WorkerProcess],
durable_processes: list[WorkerProcess],
process_names: list[str] | None = None,
restart_order=RestartOrder.SHUTDOWN_FIRST,
**kwargs,
) -> None:
"""Restart the worker processes.
Args:
process_names (Optional[List[str]], optional): The names of the processes to restart.
If `None`, then all processes will be restarted. Defaults to `None`.
restart_order (RestartOrder, optional): The order in which to restart the processes.
Defaults to `RestartOrder.SHUTDOWN_FIRST`.
""" # noqa: E501
restarted = self._restart_transient(
transient_processes,
process_names or [],
restart_order,
**kwargs,
)
restarted |= self._restart_durable(
durable_processes,
process_names or [],
restart_order,
**kwargs,
)
if process_names and not restarted:
error_logger.error(
f"Failed to restart processes: {', '.join(process_names)}"
)
def _restart_transient(
self,
processes: list[WorkerProcess],
process_names: list[str],
restart_order: RestartOrder,
**kwargs,
) -> set[str]:
restarted: set[str] = set()
for process in processes:
if not process.restartable or (
process_names and process.name not in process_names
):
continue
self._restart_process(process, restart_order, **kwargs)
restarted.add(process.name)
return restarted
def _restart_durable(
self,
processes: list[WorkerProcess],
process_names: list[str],
restart_order: RestartOrder,
**kwargs,
) -> set[str]:
restarted: set[str] = set()
if not process_names:
return restarted
for process in processes:
if not process.restartable or process.name not in process_names:
continue
if process.state not in (
ProcessState.COMPLETED,
ProcessState.FAILED,
ProcessState.NONE,
):
error_logger.error(
f"Cannot restart process {process.name} because "
"it is not in a final state. Current state is: "
f"{process.state.name}."
)
continue
self._restart_process(process, restart_order, **kwargs)
restarted.add(process.name)
return restarted
def _restart_process(self, process, restart_order, **kwargs):
process.restart(restart_order=restart_order, **kwargs)