threading.Timer + threading.Event
import threading
import time
import argparse
class Server:
def __init__(self, ):
self.screen_lock = threading.Lock() # 屏幕打印锁,和定时任务无关
self.exitEvent = threading.Event() # 主线程退出信号
self.exitEvent.clear()
def safe_print(self,*args,**kwargs):
try:
self.screen_lock.acquire()
print(*args,**kwargs)
finally:
self.screen_lock.release()
def scheduled_job(self, save_path, save_interval):
print( f"Doing scheduled job ... {time.strftime('%Y-%m-%d %H:%M:%S')}")
# TODO: complete your job here
with open(save_path, 'a') as file:
file.write('repeat doing this...n')
# 如果主线程没有退出,启动下一次定时任务
if not self.exitEvent.isSet():
self.timer = threading.Timer(
60*save_interval,
self.scheduled_job,
args = (save_path, save_interval)
)
self.timer.start()
if __name__=="__main__": # 主线程
parser=argparse.ArgumentParser()
parser.add_argument('-s','--save_interval',type=float,required=False,help='Number of minutes to wait before trying to save. Default is 10 minutes. Set to 0 to never save.',default=10)
parser.add_argument('-f','--save_path',type=str, required=True,help='File path where to save data.')
args = parser.parse_args()
server = Server()
# 第一次调度
if args.save_interval:
server.timer = threading.Timer(
60 *args.save_interval,
server.scheduled_job,
args = (args.save_path, args.save_interval)
)
server.timer.start()
while True:
try:
# TODO: server.handle_request()
time.sleep(1)
except KeyboardInterrupt:
break
if args.save_interval:
server.exitEvent.set() # 设置退出信号
server.timer.cancel() # 取消下一次调度
try: # 下一定调度提前,改成立即执行
server.scheduled_job(args.save_path, args.save_interval)
except:
server.safe_print("[!] An error occured during the final save.")
server.safe_print("Server has stopped.")
测试
>>> python testServer.py -f ./test.log -s 0.05 Doing scheduled job ... 2022-06-26 01:34:21 Doing scheduled job ... 2022-06-26 01:34:24 Doing scheduled job ... 2022-06-26 01:34:27 ^CDoing scheduled job ... 2022-06-26 01:34:28 Server has stopped. >>> cat test.log repeat doing this... repeat doing this... repeat doing this... repeat doing this...



