Python使用Timer实现每日定时发送短信多任务运行问题求助
问题核心原因
- 你创建的所有
Timer实例都没有调用.start()方法,定时任务根本没有启动,这是任务不生效的首要原因 - 时间计算逻辑有问题:直接固定给日期加1天,若当前时间早于目标时间,会导致任务延迟到第二天才触发,错过当日的执行窗口
- 逻辑仅支持单次执行,没有循环调度逻辑,无法实现每日重复发送的需求
- 主线程无阻塞逻辑,程序启动后会直接退出,后台定时器线程还没到执行时间就被销毁
修复优化后的完整代码
from zeep import Client from datetime import datetime, timedelta from threading import Timer # 统一配置执行时间和对应短信内容,避免重复代码 TASK_CONFIG = [ {"hour": 0, "content": "ppp"}, {"hour": 8, "content": "fff"}, {"hour": 9, "content": "sss"}, {"hour": 10, "content": "aaa"}, {"hour": 14, "content": "uuu"}, ] def send_simple_sms(txt): send_url = 'URL' client = Client(send_url) username = "MyUsername" password = "Password" text = txt to_type = client.get_type('ns0:ArrayOfString') to = to_type(['xxxxxxxxxxx']) from_ = "xxxxxxxx" result = client.service.SendSimpleSMS(username, password, to, from_, text, False) print(f"[{datetime.now()}] 发送结果:{result}") def schedule_task(hour, content): # 计算下一次执行时间 now = datetime.now() target_time = now.replace(hour=hour, minute=0, second=0, microsecond=0) # 如果今天的目标时间已过,就设置为明天的同一时间 if target_time < now: target_time += timedelta(days=1) delay = (target_time - now).total_seconds() # 定义执行wrapper,执行完任务后自动调度下一次 def task_wrapper(): send_simple_sms(content) schedule_task(hour, content) # 启动定时器 t = Timer(delay, task_wrapper) t.daemon = True t.start() if __name__ == "__main__": # 初始化所有定时任务 for task in TASK_CONFIG: schedule_task(task["hour"], task["content"]) print("定时短信服务已启动,等待触发...") # 阻塞主线程,避免程序退出 while True: pass
调整说明
- 新增统一配置列表管理所有定时任务,减少冗余重复的函数定义,后续要修改时间或内容只需修改配置即可
- 修复了时间计算逻辑:先判断当日目标时间是否已过,再决定是否加1天,不会错过当日的执行窗口
- 封装了自动循环调度逻辑:每次任务执行完成后会自动计算下一天的执行时间,启动新的定时器,实现每日重复触发
- 所有定时器创建后都显式调用
start()启动,同时设置为守护线程,避免程序退出时卡住 - 新增主线程阻塞逻辑,保证程序持续运行,不会启动后立即退出
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

