""" 进程主事件循环的显式生命周期登记。 """ from __future__ import annotations import threading from asyncio import AbstractEventLoop class MainLoopRegistry: """ 以 owner 身份管理可供跨线程投递的主事件循环。 """ def __init__(self) -> None: """ 初始化空 owner 集合与互斥锁。 """ self._current: AbstractEventLoop | None = None self._owners: dict[object, AbstractEventLoop] = {} self._lock = threading.Lock() @property def current(self) -> AbstractEventLoop | None: """ 返回当前登记值,不校验循环是否仍可运行。 """ with self._lock: return self._current def require(self) -> AbstractEventLoop: """ 返回可运行主循环;未启动或已关闭时明确失败。 """ loop = self.current if loop is None or not loop.is_running() or loop.is_closed(): raise RuntimeError("主事件循环尚未启动或已经停止") return loop def register(self, loop: AbstractEventLoop) -> object: """ 登记一个生命周期 owner,并返回仅供对应关闭路径释放的身份。 """ owner = object() with self._lock: self._owners[owner] = loop self._current = loop return owner def release(self, owner: object) -> None: """ 释放指定 owner,迟到的旧关闭不得清除更新的登记。 """ with self._lock: if owner not in self._owners: return self._owners.pop(owner) self._current = next(reversed(self._owners.values()), None) def replace_compat(self, loop: AbstractEventLoop | None) -> None: """ 兼容旧属性赋值,仅替换当前投递目标而不伪造 owner。 """ with self._lock: self._current = loop main_loop_registry = MainLoopRegistry()