如何在Python类中使用线程实现多实例独立可重置的倒计时计时器
错误原因分析
- 计时器定义位置错误:你将
Timer实例的创建和启动逻辑写在了类的全局作用域,而非实例初始化方法__init__中,会导致类加载时就启动一个全局共享的计时器,而非每个实例独立创建自己的计时器。 - 实例方法调用缺少绑定:
Timer的回调参数直接传入未绑定实例的类方法timeout,调用时不会自动注入self参数,因此触发参数不足的报错。
完整实现代码
以下代码支持多实例独立倒计时、非阻塞运行、计时器重置功能:
import time from threading import Timer class UserTimer: def __init__(self, id=None, current_status=None, timeout_limit=150): self.id = id self.current_status = current_status self.timeout_limit = timeout_limit self.timer = None # 实例化后立即启动倒计时 self.start_timer() def timeout(self): print("time over for", self.id) # 此处可添加倒计时结束后的业务逻辑 def start_timer(self): # 停止旧计时器,避免重复计时 if self.timer is not None: self.timer.cancel() # 传入绑定了当前实例的timeout方法作为回调 self.timer = Timer(self.timeout_limit, self.timeout) self.timer.start() # 支持赋值触发重置的属性实现 @property def reset_timer(self): return False @reset_timer.setter def reset_timer(self, value): if value: self.start_timer()
使用示例
# 多实例化测试,两个计时器并行运行不阻塞 params1 = {'id': "test@hello.com", 'current_status': "success"} params2 = {'id': "test2@hello.com", 'current_status': "success"} user1 = UserTimer(**params1) user2 = UserTimer(**params2) # 重置user1的倒计时 user1.reset_timer = True
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

