You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单线程持续更新变量,多线程只读访问的标准实现方式

单写多读场景下变量的标准实现方案

你的需求是单个线程持续更新变量,其他线程仅读取、无需协作,允许读取到不同版本的变量值,下面是对应的标准实现方式及修正后的示例:

先修正你的示例代码问题

原代码里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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:03:23