1.sched
python内置的模块,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度。
import sched
import time
from datetime import datetime
# 初始化sched模块的 scheduler 类
# 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
# 生成调度器
schedule = sched.scheduler(time.time, time.sleep)
# 被周期性调度触发的函数
def printTime(inc):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
schedule.enter(inc, 0, printTime, (inc,))
# 默认参数60s
def main(inc=60):
# enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,
# 给该触发函数的参数(tuple形式)
schedule.enter(0, 0, printTime, (inc,))
schedule.run()
# 10s 输出一次
main(10)
2.threading.Timer
在多线程场景中,会有线程安全问题,run()函数会阻塞主线程。官方建议使用threading.Timer类代替
import time
from threading import Timer
def print_time(t):
print("From print_time", time.time(),t)
def print_some_times():
print(time.time())
Timer(5, print_time,args=("5s",)).start()
Timer(10, print_time,args=("10s",)).start()
time.sleep(11) # 阻塞主线程,等待调度程序执行完毕,再执行后面内容
print(time.time())
print_some_times()
3.schedule
使用命令安装schedule库
pip install schedule
import schedule
import time
def job(name):
print("I'm working...",name)
#每隔十分钟执行一次任务
schedule.every(10).minutes.do(job,name)
# 每隔一小时执行一次任务
schedule.every().hour.do(job,name)
# 每天的10:30执行一次任务
schedule.every().day.at("10:30").do(job,name)
# 每隔5到10天执行一次任务
schedule.every(5).to(10).days.do(job,name)
# 每周一的这个时候执行一次任务
schedule.every().monday.do(job,name)
# 每周三13:15执行一次任务
schedule.every().wednesday.at("13:15").do(job,name)
while True:
#run_pending:运行所有可以运行的任务
schedule.run_pending()
time.sleep(1)