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

每秒执行函数并对比前后返回值的线程存储值实现问题

解决线程中存储并对比前后执行值的问题

嘿,我明白你的困扰了——想用threading每秒跑一次代码,还得对比当前和上一次的返回值,但不知道怎么安全地存储这个“上一次的值”对吧?其实核心就是处理线程间的共享状态,我给你两个实用的方案,都能搞定这个问题:

方案一:用类封装状态(推荐,更整洁安全)

把需要保存的上次值和线程锁都封装到类里,这样代码结构清晰,也能避免全局变量的混乱:

import random
import threading
import time

class ValueComparator:
    def __init__(self):
        self.previous_value = None
        # 线程锁:保证对previous_value的读写操作是原子的,避免竞态条件
        self.lock = threading.Lock()

    def generate_random(self):
        # 你的随机数生成函数
        return random.randint(1, 101)

    def run_check_loop(self):
        while True:
            current_val = self.generate_random()
            # 用with语句自动管理锁,不用手动加锁/解锁,更安全
            with self.lock:
                if self.previous_value is not None:
                    is_equal = current_val == self.previous_value
                    print(f"当前值: {current_val} | 上一次值: {self.previous_value} | 是否相等: {is_equal}")
                # 更新上一次的值
                self.previous_value = current_val
            # 暂停1秒
            time.sleep(1)

if __name__ == "__main__":
    comparator = ValueComparator()
    # 创建并启动线程
    check_thread = threading.Thread(target=comparator.run_check_loop)
    # 设置为守护线程,主程序退出时线程自动结束
    check_thread.daemon = True
    check_thread.start()
    # 让主程序保持运行,按任意键退出
    input("按任意键停止程序...\n")

方案二:全局变量加锁(简单直接)

如果你不想用类,也可以用全局变量存储上次值,但一定要配合线程锁来保证安全:

import random
import threading
import time

# 全局变量存储上一次的值
previous_value = None
# 线程锁,保护全局变量的读写
lock = threading.Lock()

def ran():
    return random.randint(1, 101)

def check_loop():
    global previous_value
    while True:
        current_val = ran()
        with lock:
            if previous_value is not None:
                print(f"当前值: {current_val}, 上一次值: {previous_value}, 是否相等: {current_val == previous_value}")
            previous_value = current_val
        time.sleep(1)

if __name__ == "__main__":
    t = threading.Thread(target=check_loop)
    t.daemon = True
    t.start()
    input("按任意键退出\n")

关键说明

为什么需要锁?因为线程是共享进程内存空间的,如果多个线程同时读写previous_value,可能会出现竞态条件(比如一个线程还没写完值,另一个线程就去读了)。用threading.Lock可以确保同一时间只有一个线程能访问这个变量,避免出错。

这样你就能每秒执行一次代码,安全地对比当前和上一次的返回值啦!

内容的提问来源于stack exchange,提问作者Doomski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:23:03