跳转到内容

防休眠锁

from uda import Uda, WakeLockType
with Uda() as uda:
# 只阻止屏幕变暗/关闭,系统仍可待机
with uda.wakelock(WakeLockType.DISPLAY, reason="正在演示") as lock:
print("屏幕保持点亮")
# 同时阻止系统空闲挂起
with uda.wakelock(WakeLockType.SYSTEM, reason="视频转码") as lock:
print("系统保持唤醒")
类型 语义
WakeLockType.DISPLAY 阻止显示器关闭。用户按电源键仍可手动休眠
WakeLockType.SYSTEM 阻止系统空闲判定与自动挂起

平台映射上,Linux 侧对应 org.freedesktop.ScreenSaver.Inhibit 的 flags(8 = Idle,12 = Idle + Suspend),Windows 侧对应 SetThreadExecutionState 的 ES_CONTINUOUS 加上 ES_DISPLAY_REQUIRED / ES_SYSTEM_REQUIRED。

平台 机制
Linux 会话总线上的 org.freedesktop.ScreenSaver.Inhibit;DISPLAY 锁传 flag 8(idle),SYSTEM 锁传 12(idle + suspend)。释放时用守护进程返回的 cookie 调用 UnInhibit
Windows SetThreadExecutionState:DISPLAY 锁为 ES_CONTINUOUS | ES_DISPLAY_REQUIRED,SYSTEM 锁再加 ES_SYSTEM_REQUIRED;释放时恢复默认的 ES_CONTINUOUS

没有更多回退层级:Linux 侧 ScreenSaver 服务是唯一后端,Windows 侧 SetThreadExecutionState 总可用。会话总线不可达时调用返回类型化错误。

WakeLock 实现了上下文管理器,离开 with 块即释放:

with uda.wakelock(reason="下载") as lock:
download() # 即使抛异常,锁也会释放

也可以手动释放,且重复调用是安全的:

lock = uda.wakelock(reason="下载")
lock.release()
lock.release() # no-op

Node.js 侧用 release():

const lock = uda.wakelock('system', '视频转码');
// ...
lock.release();

reason 字符串会传给平台用于日志与诊断——例如屏幕保护程序显示是谁在阻止休眠,或 Windows 的电源请求追踪。保持简短可读;它不会作为通知展示给用户。