如何在Python中实现永久运行的定时任务:每5/10分钟执行不同函数
实现Python定时重复任务的两种实用方案
嘿,我来帮你搞定这个定时任务的问题!先直接回答你的疑问:不一定非要用threading,但用线程的话会让你的定时逻辑更灵活,尤其是当任务可能耗时的时候。下面给你两种从简单到进阶的方案,你可以根据自己的需求选择。
方案一:单线程轮询(新手友好)
这个方案逻辑特别直观,不用接触复杂的线程概念,适合刚入门的朋友。核心思路就是用一个无限循环,每次循环里检查当前时间是否到了执行任务的节点,然后休眠一小段时间再继续轮询。
import time from datetime import datetime def RunMeEvery5min(): print(f"执行5分钟任务: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 在这里替换成你实际要执行的任务逻辑 def RunMeEvery10min(): print(f"执行10分钟任务: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 在这里替换成你实际要执行的任务逻辑 # 记录上次执行两个任务的时间戳 last_5min_run = time.time() last_10min_run = time.time() while True: current_time = time.time() # 检查是否到了5分钟任务的执行时间 if current_time - last_5min_run >= 5 * 60: RunMeEvery5min() last_5min_run = current_time # 检查是否到了10分钟任务的执行时间 if current_time - last_10min_run >= 10 * 60: RunMeEvery10min() last_10min_run = current_time # 每次循环休眠1秒,避免占用过多CPU资源 time.sleep(1)
方案特点:
- 逻辑简单,容易理解和调试,完全符合你写顺序程序的思维习惯
- 小缺点:如果某个任务执行时间很长(比如超过1分钟),会阻塞循环,影响下一次任务的执行时间
方案二:多线程调度(灵活可靠)
如果你的任务可能耗时,或者希望两个任务严格按照自己的周期执行(比如不管上一次有没有完成,到点就启动新的执行),那用threading就很合适。我们可以用threading.Timer来实现定时重复调用。
import threading import time from datetime import datetime def RunMeEvery5min(): print(f"执行5分钟任务: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 在这里替换成你实际要执行的任务逻辑 # 任务完成后,自动调度下一次执行 threading.Timer(5 * 60, RunMeEvery5min).start() def RunMeEvery10min(): print(f"执行10分钟任务: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 在这里替换成你实际要执行的任务逻辑 # 任务完成后,自动调度下一次执行 threading.Timer(10 * 60, RunMeEvery10min).start() if __name__ == "__main__": # 启动第一次任务执行 RunMeEvery5min() RunMeEvery10min() # 让主线程保持运行,否则程序会直接退出 while True: time.sleep(3600) # 休眠1小时,避免占用CPU资源
方案特点:
- 两个任务独立运行,互相不干扰,即使其中一个任务卡住,另一个依然能按周期执行
- 每次任务执行完成后才会调度下一次,避免同一任务重复叠加执行(如果需要叠加执行可以调整逻辑)
- 扩展性强,以后新增定时任务只需要复制类似的函数和启动逻辑即可
总结
- 如果你的任务都是轻量、快速完成的,单线程方案完全够用,上手零门槛
- 如果任务可能耗时,或者需要严格的定时精度,多线程方案会更靠谱
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

