单线程持续更新变量,多线程只读访问的标准实现方式
单写多读场景下变量的标准实现方案
你的需求是单个线程持续更新变量,其他线程仅读取、无需协作,允许读取到不同版本的变量值,下面是对应的标准实现方式及修正后的示例:
先修正你的示例代码问题
原代码里t2 = Thread(target=thread_target2())是错误的——这里直接调用了thread_target2函数,而非传递函数引用,应该改为threading.Thread(target=thread_target2)。另外需要补充必要的模块导入,以及设置守护线程避免主程序无法正常退出。
修正后的可运行代码:
import threading import random import time number = 0 def write_thread(): global number while True: # 对不可变类型(int)的赋值是原子操作,不会出现半更新状态 number = random.randint(1, 60) time.sleep(0.1) # 降低CPU占用 def read_thread(): global number for _ in range(10): print(f"读取到数值:{number}") time.sleep(1) if __name__ == "__main__": t_write = threading.Thread(target=write_thread) t_write.daemon = True # 设置为守护线程,主程序结束时自动终止 t_read = threading.Thread(target=read_thread) t_write.start() t_read.start() t_read.join()
标准实现工具与语法
1. 普通全局变量(最适合你的需求)
在Python中,对于不可变类型(int、str、float等),单线程的赋值操作是原子性的——也就是说,写线程的赋值要么完全完成,要么没开始,不会出现读取线程读到“半完成”的值的情况。这种方式完全符合你的需求:
- 无需额外同步工具,代码简洁
- 允许不同读取线程读到不同版本的变量值
- 注意:如果变量是可变类型(如list、dict),修改操作(比如
list.append())不是原子的,可能会读到中间状态;如果接受这种情况可以不用锁,否则需要加threading.Lock。
2. 可选进阶工具(针对特殊需求)
如果后续需要扩展需求,比如读取线程要感知变量更新,可以用threading.Event来触发通知;如果需要读取线程按顺序获取更新值,可以用queue.Queue实现生产者-消费者模式,但这些都超出了你当前的需求范围。
核心注意点
- 确保写线程的变量操作是原子性的,避免读取到无效的中间值
- 无限循环的写线程建议设置为守护线程,避免主程序退出后仍在后台运行
内容的提问来源于stack exchange,提问作者Entman
相关产品推荐
相关产品推荐

