python实现定时自动启动代码 线程方法(每日更新、爬虫等)

本文是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()

总结

代码可以用但是性能没有测试……还有线程的中断是关闭进程,过于原始的方法显得非常不优雅。如果你感兴趣可以自己修改一下。

上一篇:线程,Python 实现多任务的方式之一


下一篇:System.Threading.CancellationTokenRegistration.cs