在某些场景需要定时刷新对象的属性,如:为了使token不过期,需要定时刷新对象的token属性
若使用递归调用,则可能会导致调用深度过深而自动退出
- 使用 sched 模块定时调度刷新函数
- 在
__init__()
函数中创建子进程循环调用 - 在
__del__()
函数中停止子进程,使子进程的生命周期与类对象一致
import datetime
import multiprocessing
import time
import sched
class Test():
def __init__(self) -> None:
self.data = 0
self.p = multiprocessing.Process(target=self.loop, args=())
self.p.daemon = True
self.p.start()
def __del__(self):
try:
# 停止进程
self.p.terminate()
self.p.join()
except:
pass
def refresh(self):
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
self.data += 1
print(f"{ts} update data: {self.data}")
def loop(self):
while True:
s = sched.scheduler(time.time, time.sleep) # 生成调度器
s.enter(2, 1, self.refresh, ())
s.run()
if __name__ == "__main__":
t = Test()
time.sleep(10)
del t
time.sleep(5)