43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
from importlib import import_module
|
|
|
|
|
|
def patch_inference_executor_is_alive() -> bool:
|
|
"""
|
|
Guard LiveKit's health check against a closed multiprocessing.Process.
|
|
|
|
livekit-agents==1.3.10 calls InferenceProcExecutor.is_alive() from the
|
|
aiohttp health route. After shutdown, multiprocessing raises
|
|
ValueError("process object is closed"), which turns a normal unhealthy
|
|
state into a 500.
|
|
"""
|
|
|
|
try:
|
|
module = import_module("livekit.agents.ipc.inference_proc_executor")
|
|
except ImportError:
|
|
return False
|
|
|
|
executor_cls = getattr(module, "InferenceProcExecutor", None)
|
|
if executor_cls is None:
|
|
return False
|
|
|
|
current_is_alive = getattr(executor_cls, "is_alive", None)
|
|
if current_is_alive is None:
|
|
return False
|
|
|
|
if getattr(current_is_alive, "__tim_closed_process_guard__", False):
|
|
return False
|
|
|
|
def _safe_is_alive(self) -> bool:
|
|
try:
|
|
return current_is_alive(self)
|
|
except ValueError as exc:
|
|
if str(exc) != "process object is closed":
|
|
raise
|
|
return False
|
|
|
|
_safe_is_alive.__tim_closed_process_guard__ = True
|
|
executor_cls.is_alive = _safe_is_alive
|
|
return True
|