Python实现定时任务的5种常用方法详解
本文系统梳理了Python中实现定时任务的多种方案,涵盖基础的循环sleep阻塞方式、非阻塞的threading Timer机制、内置sched调度器,以及功能强大的APScheduler框架。此外还介绍了通过打包exe结合Windows计划任务实现系统级调度的方法,帮助开发者根据阻塞需求、持久化要求及部署环境选择最合适的定时执行策略。
在Python开发中,实现定时执行任务的方案丰富多样。本文将重点介绍几种主流且实用的实现路径。
方案一:循环配合sleep函数
这是最直观的实现方式,即在无限循环中执行目标任务,随后调用sleep函数等待指定时间间隔后再进行下一次执行。该方法的局限性在于控制精度较低,且由于sleep是阻塞式调用,会占用当前线程资源,可能导致程序响应延迟。
def timer(n):
'''''
每n秒执行一次
'''
while True:
print time.strftime('%Y-%m-%d %X',time.localtime())
yourTask() # 此处为要执行的任务
time.sleep(n)
方案二:利用threading模块的Timer类
Python标准库中的threading模块提供了Timer类,可用于实现非阻塞的定时任务。与sleep不同,Timer会在指定时间后触发回调函数,期间主线程或其他代码可继续运行,互不干扰。
例如,实现3秒后执行一次打印“helloworld”的操作:
def printHello(): print "hello world" Timer(3, printHello).start()
若需实现每隔3秒循环打印一次“helloworld”,可采用递归调用的Timer方式:
def printHello(): print "Hello World" t = Timer(2, printHello) t.start() if __name__ == "__main__": printHello()
方案三:使用sched模块进行调度
sched模块提供了通用的调度机制,适用于需要精确控制事件执行顺序和优先级的场景,支持延时处理及事件队列管理。
# -*- coding:utf-8 -*-
# use sched to timing
import time
import os
import sched
# 初始化sched模块的scheduler类
# 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
schedule = sched.scheduler(time.time, time.sleep)
# 被周期性调度触发的函数
def execute_command(cmd, inc):
'''''
终端上显示当前计算机的连接情况
'''
os.system(cmd)
schedule.enter(inc, 0, execute_command, (cmd, inc))
def main(cmd, inc=60):
# enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,
# 给该触发函数的参数(tuple形式)
schedule.enter(0, 0, execute_command, (cmd, inc))
schedule.run()
# 每60秒查看下网络连接情况
if __name__ == '__main__':
main("netstat -an", 60)
方案四:采用APScheduler定时框架
APScheduler是一个基于Quartz的Python定时任务框架,功能强大。它支持基于日期、固定时间间隔以及Crontab表达式等多种触发类型,并具备任务持久化能力,适合复杂业务场景。
由于作者尚未对该框架进行实际测试,后续若有深入使用经验,将补充相关实践内容。
方案五:结合Windows系统定时任务
对于Windows环境,可将Python脚本打包为exe可执行文件,随后利用Windows自带的“任务计划程序”设置定时执行规则。这种方式不依赖Python进程常驻,系统资源占用更低,适合长期运行的后台任务。
以上内容总结了Python实现定时任务的主要技术手段,旨在为不同场景下的开发需求提供参考。希望这些信息能对您的学习与实践有所帮助,欢迎持续关注本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









