每秒执行函数并对比前后返回值的线程存储值实现问题
解决线程中存储并对比前后执行值的问题
嘿,我明白你的困扰了——想用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
相关产品推荐
相关产品推荐

