本文是csdn的另一篇:python 定时器,每天凌晨3点执行 方法的更新
python实现定时自动启动代码 线程方法(每日更新、爬虫等)
本文使用threading.Timer(seconds, fun)的方法实现周期启动
通过datetime.datetime.now()等方法获取当前时间同时做校正判断
定时自启动函数的效果
如果想即食 直接修改marktime
然后在func加入你的代码或者调用你的函数
注释版
import datetime
import threading
marktime=" 18:02:20"
# 修改:上面的marktime改成你需要的自启动时间即可
# (空格别删了)请按照以上格式修改时间哦 乱修改会报错
# 运行函数
def func():
# 在这里加你的函数即可
print("haha")
#如果需要循环调用,就要添加以下方法
timer = threading.Timer(86400, func)
# 86400是3600*24 懂我意思吧
timer.start()
# preFun预处理函数 对第一次启动进行今日或次日时间判断 然后方便进行正确的自启动
def preFun():
# 获取现在时间
now_time = datetime.datetime.now()
marktimes = datetime.datetime.strptime(str(now_time.date()) + marktime, "%Y-%m-%d %H:%M:%S")
# marktimes是datetime化的时间数据类型
# 2020-03-13 17:35:26.772379 marktimes是如左类似结构
# 今日时间是否预期
if (now_time <= marktimes):
next_time = marktimes
print("今日" + marktime + '执行代码')
else:
# 明日启动
next_time = now_time + datetime.timedelta(days=+1)
print("明日" + marktime + '执行代码')
# 这下面可以优化 懒得弄了……哈啊哈哈
next_year = next_time.date().year
next_month = next_time.date().month
next_day = next_time.date().day
next_time = datetime.datetime.strptime(str(next_year) +
"-" + str(next_month) +
"-" + str(next_day) + marktime,
"%Y-%m-%d %H:%M:%S")
# next_time将得到的下次时间更新成秒数表示的时间
# 科普一下 就是那种time.time()函数得到的秒 这样的时间方便计算 不然要疯狂的进制转化……
# 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
# 获取距离下次marktime时间,单位为秒
timer_start_time = (next_time - now_time).total_seconds()
return timer_start_time
def main():
timer_start_time=preFun()
# 把与处理得时间放进去 然后线程在start()后
# 会在规定秒数后启动你的func里的代码
timer = threading.Timer(timer_start_time, func)
# 运行线程
timer.start()
print('冷启动后启动func的时间',timer_start_time)
pass
if __name__ == '__main__':
main()
简洁版
import datetime
import threading
marktime=" 18:02:20"
# 运行函数
def func():
# 在这里加你的函数即可
print("haha")
timer = threading.Timer(86400, func)
timer.start()
# preFun预处理函数
def preFun():
now_time = datetime.datetime.now()
marktimes = datetime.datetime.strptime(str(now_time.date()) + marktime, "%Y-%m-%d %H:%M:%S")
if (now_time <= marktimes):
next_time = marktimes
print("今日" + marktime + '执行代码')
else:
# 明日启动
next_time = now_time + datetime.timedelta(days=+1)
print("明日" + marktime + '执行代码')
next_year = next_time.date().year
next_month = next_time.date().month
next_day = next_time.date().day
next_time = datetime.datetime.strptime(str(next_year) +
"-" + str(next_month) +
"-" + str(next_day) + marktime,
"%Y-%m-%d %H:%M:%S")
timer_start_time = (next_time - now_time).total_seconds()
return timer_start_time
def main():
timer_start_time=preFun()
timer = threading.Timer(timer_start_time, func)
timer.start()
print('冷启动后启动func的时间',timer_start_time)
pass
if __name__ == '__main__':
main()
总结
代码可以用但是性能没有测试……还有线程的中断是关闭进程,过于原始的方法显得非常不优雅。如果你感兴趣可以自己修改一下。