Files
NebulaShell/oss/core/lifecycle.py
Starlight-apk e67d2d8ef6
Some checks failed
CI / test (3.10) (push) Has been cancelled
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.13) (push) Has been cancelled
refactor: 优化 NBPF 模块 - 缓存导入/合并重复方法/减少I/O
- crypto.py: 8个_imp_*方法改为_ModuleCache类缓存导入
- crypto.py: outer/inner加解密合并为_layer_encrypt/decrypt
- crypto.py: 提取公共摘要计算方法,拆分长方法
- compiler.py: 删除_obfuscate_code中未使用的死代码
- loader.py: 3次ZIP扫描合并为1次缓存读取
- format.py: 更新为使用_ModuleCache
- 合计减少205行代码(1707→1502)
2026-05-17 15:36:45 +08:00

107 lines
3.2 KiB
Python

from typing import Any, Optional, Callable
class LifecycleState:
PENDING = "pending"
RUNNING = "running"
STOPPED = "stopped"
DEGRADED = "degraded"
CRASHED = "crashed"
class LifecycleError(Exception):
pass
class Lifecycle:
VALID_TRANSITIONS = {
LifecycleState.PENDING: [LifecycleState.RUNNING],
LifecycleState.RUNNING: [LifecycleState.STOPPED, LifecycleState.DEGRADED, LifecycleState.CRASHED],
LifecycleState.STOPPED: [LifecycleState.RUNNING],
LifecycleState.DEGRADED: [LifecycleState.RUNNING, LifecycleState.STOPPED],
LifecycleState.CRASHED: [LifecycleState.PENDING, LifecycleState.STOPPED],
}
def __init__(self, name: str):
self.name = name
self.state = LifecycleState.PENDING
self._hooks: dict[str, list[Callable]] = {
"before_start": [], "after_start": [],
"before_stop": [], "after_stop": [],
"on_crash": [], "on_degrade": [],
}
self._extensions: dict[str, Any] = {}
def add_extension(self, name: str, extension: Any):
self._extensions[name] = extension
def get_extension(self, name: str) -> Any:
return self._extensions.get(name)
def start(self):
for hook in self._hooks["before_start"]:
hook(self)
self.transition(LifecycleState.RUNNING)
for hook in self._hooks["after_start"]:
hook(self)
def stop(self):
if self.state in (LifecycleState.RUNNING, LifecycleState.DEGRADED):
for hook in self._hooks["before_stop"]:
hook(self)
self.transition(LifecycleState.STOPPED)
for hook in self._hooks["after_stop"]:
hook(self)
def restart(self):
self.stop()
self.start()
def mark_crashed(self):
self.transition(LifecycleState.CRASHED)
for hook in self._hooks["on_crash"]:
hook(self)
def mark_degraded(self):
self.transition(LifecycleState.DEGRADED)
for hook in self._hooks["on_degrade"]:
hook(self)
def on(self, event: str, hook: Callable):
if event in self._hooks:
self._hooks[event].append(hook)
def transition(self, target_state: LifecycleState):
valid = self.VALID_TRANSITIONS.get(self.state, [])
if target_state in valid:
self.state = target_state
else:
raise LifecycleError(f"Cannot transition from {self.state} to {target_state}")
class LifecycleManager:
def __init__(self):
self.lifecycles: dict[str, Lifecycle] = {}
def create(self, name: str) -> Lifecycle:
lifecycle = Lifecycle(name)
self.lifecycles[name] = lifecycle
return lifecycle
def get(self, name: str) -> Optional[Lifecycle]:
return self.lifecycles.get(name)
def start_all(self):
for lc in self.lifecycles.values():
try:
lc.start()
except LifecycleError as e:
pass # 生命周期转换失败是预期行为
def stop_all(self):
for lc in self.lifecycles.values():
try:
lc.stop()
except LifecycleError as e:
pass # 生命周期转换失败是预期行为