简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

ErisPulse.runtime.reload_ops 模块


模块概述

热重载操作协调器

reload / restart / 归眠(sleep)共享的全局互斥与 restart 风暴合并:


函数列表

_current_task() -> 'asyncio.Task[Any] | None'

内部方法 当前任务(无运行循环时为 None)


async run_reload_exclusive(fn: 'Callable[[], Awaitable[_T]]') -> _T

在热重载全局互斥下执行 fn(重入直通)

所有重载入口(单模块 / 全量 / 适配器 / restart 内部管线)统一经本 函数进入:并发触发自动串行;已持锁任务内重入(如 on_unload 钩子内再触发重载)直接执行避免自锁。

返回值 (fn): 的返回值

示例:

await run_reload_exclusive(lambda: loader.reload_module("dice", m, s))

类列表

class ReloadOpsCoordinator

内部方法 热重载操作的全局互斥锁与 restart 合并状态机

状态机:

IDLE ──restart()──► RUNNING ──完成──┬─ dirty=0 → 释放锁(IDLE)
             │restart()             └─ dirty=1 → 置0,补跑一轮(RUNNING)
             ▼
         dirty=True(记「已合并」日志)

reload_module / reload_adapter / reload_all / sleep 不 参与 dirty 状态机——晚到的文件改动必须真正执行,不能靠「restart 已 覆盖」推断丢弃(改动可能发生在 restart 读取文件之后),它们只在锁上 排队等待。

示例:

from ErisPulse.runtime.reload_ops import run_reload_exclusive
result = await run_reload_exclusive(lambda: loader.reload_module(...))

方法列表

is_reentrant() -> bool

当前任务是否已持有热重载互斥锁(重入直通判定)

返回值: 是否重入


is_locked() -> bool

互斥锁是否被持有(任意任务)

返回值: 是否有热重载操作进行中


mark_restart_pending() -> bool

登记一次 restart 请求(restart() 入口调用)

返回值: True = 已有 restart 进行中,本次请求已合并为 dirty 补跑

(调用方直接返回,无需自行调度);False = 当前无 restart
持锁(调用方需自行调度执行)

begin_restart_section() -> None

内部方法 标记当前持锁任务为 restart(进入补跑循环前调用)


consume_restart_dirty() -> bool

内部方法 消费 dirty 标记(restart 每轮结束时调用)

返回值: True = 期间有合并进来的 restart 请求,需补跑一轮


async run_or_skip(fn: 'Callable[[], Awaitable[_T]]', *, timeout: float, skip_log_key: str, log_params: 'dict[str, Any] | None' = None) -> '_T | None'

限时等待互斥锁后执行 fn;超时跳过(返回 None,调用方下轮再试)

重入(当前任务已持锁)时直接执行,不等待。

返回值 (fn): 的返回值;超时跳过时为 None