用并发类封装状态更清晰安全,即将全局变量转为私有实例属性、统一通过加锁类方法访问、结合ContextVar实现上下文隔离、用不可变对象降低同步复杂度。
直接用并发类封装状态,比反复检查外部全局变量更清晰、更安全。关键不是“替代判定”,而是把状态和操作绑定在同一个作用域里,让读写天然受控。
把全局状态收进类的私有属性
原先散落在模块顶层的变量(比如 current_user_id、is_running)全部移到类内部,声明为私有实例属性(如 self.__state 或 self._status)。这样状态不再暴露在外,也不会被任意线程误改。
- 避免多个函数反复判断
if GLOBAL_FLAG is not None这类冗余逻辑 - 所有状态变更必须通过类方法触发,自然形成统一入口
- 初始化时就能明确状态边界,比如
self.__counter = 0而非依赖模块级变量是否已被赋值
用类方法统一管理并发访问
私有属性本身不解决并发问题,但为加锁提供了天然粒度。所有读写都走类方法,就能在方法内集中处理同步。
- 在
get_value()和set_value(new)方法里加with self.__lock: - 不需要每个调用方都记得加锁,也不用到处传
threading.Lock()实例 - 可结合
@property和@setter提供简洁接口,底层仍可控
配合 contextvars 实现上下文隔离
如果状态需按请求/任务隔离(比如 Web 请求中的用户上下文),不要用类实例共享,而应搭配 contextvars.ContextVar。
- 定义
request_id_var = ContextVar('request_id', default=None)在模块顶层 - 类方法中通过
request_id_var.get()获取当前上下文值,无需传参 - 避免为每个请求新建类实例,也避免线程局部存储(
threading.local)在协程中失效的问题
用不可变对象降低同步复杂度
当状态本身是结构化数据(如配置、上下文元信息),优先用 dataclass(frozen=True) 或 NamedTuple 封装私有属性。
- 一旦创建就不能修改,天然线程安全
- 更新时返回新对象,配合原子赋值(
self.__config = new_config)即可 - 省去细粒度锁,也避免读到中间态

















