certflow.utils.retry module¶
SQLite 写操作退避重试工具
网络盘(坚果云等)上的 SQLite 文件在并发读写时极易出现
database is locked / database table is locked 错误。本项目里
UI 主线程(保存订正、写打印日志)与队列工作线程(写 print_jobs)
会同时访问同一个 .db 文件,普通 sqlite 引擎无 busy_timeout
时一旦撞车就直接抛锁异常。
本模块提供:
- retry_on_locked():对可调用对象做指数退避重试,专门消化瞬时写锁
(默认 12 次 / 上限 ~8s)。配合
certflow.utils.database里的WAL + busy_timeoutPRAGMA 使用,可彻底消除打印流程中的写保护锁。
示例
>>> from certflow.utils.retry import retry_on_locked
>>> retry_on_locked(session.commit)
- certflow.utils.retry.retry_on_locked(fn, *args, max_attempts=12, base_delay=0.05, max_delay=0.8, silent=False, **kwargs)[源代码]¶
执行可调用对象,遇 SQLite 写锁则指数退避重试。
仅对写锁类异常(
database is locked等)重试;其他异常原样抛出。 适合包裹session.commit()/session.flush()这类幂等写库操作。- 参数:
- 返回:
fn的返回值。- 返回类型:
T
示例
>>> retry_on_locked(session.commit) >>> retry_on_locked(session.flush)
- certflow.utils.retry.with_db_retry(max_attempts=12, base_delay=0.05, max_delay=0.8)[源代码]¶
装饰器版本:把含写库的函数包进
retry_on_locked()。示例
>>> @with_db_retry() ... def save(session): ... session.commit()