python定时任务调度
A. python实现定时任务
缺点:不容易控制,而且是个阻塞函数
优点:可以管理和调度多个任务,可以进行控制
缺点:阻塞式函数
优点:非阻塞
缺点:不易管理多个任务
sched模块实现了一个时间调度程序,该程序可以通过单线程执行来处理按照时间尺度进行调度的时间。
通过调用 scheler.enter(delay,priority,func,args) 函数,可以将一个任务添加到任务队列里面,当指定的时间到了,就会执行任务( func函数 )。
执行结果为:
按顺序执行任务:
执行结果为:
s.run()会阻塞当前线程的执行
可以用
也可以用 s.cancal(action) 来取消sched中的某个action
运行结果为:
运行结果为:
运行结果:
celery框架后续更新
B. python读取windows定时任务
1、准备好Python脚本py文件,放置在一个文件夹下。
2、创建一个txt文件,并把文件类型(后缀)改为bat、编写文件内容。
3、Win键+R,输入compmgmt,msc,调出计算机管理窗口。点击左侧任务计划程序,再点击右侧创建基本任务。
4、填写任务的基本信息,选择脚本执行的触发器。
5、选择具体时间,选择执行的操作、选择要执行的脚本,创建完成。
C. python3定时器
在实际应用中,我们经常需要使用定时器去触发一些事件。Python中通过线程实现定时器timer,其使用非常简单。看示例:
一秒后输出 Hello Timer!
oneshot的定时器这样就可以实现。
如果要实现cycle的定时器,则可以:
1s后定时器启动后,将再次以5.5s为间隔周期性执行回调fun_timer函数
结果是:
在使用Python定时器时需要注意:
1.定时器构造函数主要有2个参数,第一个参数为时间,第二个参数为函数名,第一个参数表示多长时间后调用后面第二个参数指明的函数。第二个参数注意是函数对象,进行参数传递,用函数名(如fun_timer)表示该对谈册象,不能写成函数执行语句fun_timer(),不然含核宏会报错。
2.定时器间隔单位是秒,可以是浮点数,如5.5,0.02等,在执行函数fun_timer内部和外部中给的值氏族可以不同。如上例中第一次执行fun_timer是1秒后,后面的都是5.5秒后执行。
3.可以使用cancel停止定时器的工作
D. 定时任务
实现定时任务的方法有很多,接下来我们针对各种方法对比下优缺点。
sched模块实现了一个时间调度程序,该程序可以通过单线程执行来处理按照时间尺度进行调度的时间。
通过调用scheler.enter(delay,priority,func,args)函数,可以将一个任务添加到任务队列里面,当指定的时间到了,就会执行任务(func函数)。
执行结果为:
按顺序执行任务:
执行结果为:
s.run()会阻塞当前线程的执行
可以用
也可以用s.cancal(action)来取消sched中的某个action
APScheler有四种组件:
示例2、
示例3、
示例4、
运行结果为:
示例5、
运行结果:
示例6、
示例7、
缺点: 遇到问题排查时比较困难。
精讲见celery
优点: 基于Redis的作业队列工具,优先选择APScheler定时框架。小而精。
缺点: 没有定时执行的功能。
后续精讲持续更新中。。。
可以将所需要的Python程序打包成exe文件,然后在windows下设置定时执行。
常见:
Windows 任务计划程序
Windows Service
SQL Agent 的 Job
优点: 可以管理和调度多个任务,可以进行控制。
缺点: 阻塞式函数
优点: 不需要程序自己维护定时器,不占用程序的资源。
缺点: 不太灵活,crontab因为是操作系统的命令,独立于程序运行,所以也就是在程序还没有运行的时候,就已经确定了有哪些定时任务需要执行,并东提前交代给了linux系统,如果程序运行当中,发现有新的定时任务需求,想要让程序自动交代给crontab一个新的定时任务,并不是很方便。
语法
或
说明
参数说明
E. python如何实现程序定时执行的功能
sleep就可以吧,顷闭槐把程态饥序作为一个线雀友程,启动线程,里面加个sleep,示例如下:x0dx0aimport threadingx0dx0aimport timex0dx0aclass Test(threading.Thread):x0dx0a def __init__(self):x0dx0a passx0dx0a x0dx0a def test(self):x0dx0a print 'run test!'x0dx0a x0dx0a def run(self):x0dx0a while True:x0dx0a print time.strftime('%Y-%m-%d %H:%M:%S')x0dx0a self.test()x0dx0a time.sleep(5)x0dx0a#test...x0dx0aa=Test()x0dx0aa.run()x0dx0a#...test
F. python定时每个工作日
1).window下是dir命令,linux是ls
我们用platform这个模块来判断一下操作系统,a.我们先获取当租改前的时间,假设当前时间是2017-02-09 20:19:47.555000
b.然后我们输入一个你弊拦判要定时执行的target时间,比如你是x分10秒的时候执行sched_Timer=datetime.datetime(x,x,x,x,x,10),前面的x是并不重要(只要最后是10秒就行了),我们就把目标时间设的比当前晚一点即可:c.好当时间到了20:20:10的时候要运行我们的程序,如何定时到了呢,很简单用,d.那么如何让时间在下一分钟10秒继续执行呢,也很简单用timedelta()
datetime.timedelta(minutes=1)把target时间往后增加一分钟,然后外边用个while 死循环hold住就可以了。同样的这个代码也可以扩展,把minutes=1改成hours=1就变成了每个小时定时任务,改成days=1就变成每天的定时任务。衡睁
G. python查看timer定时任务已开启
python查看timer定时任务已开启 的操作方法:Timer定时任务
下面仔贺册是Timer函数的官方doc介绍信息
"""
Call a function after a specified number of seconds:
t = Timer(30.0, f, args=None, kwargs=None)
t.start()
t.cancel() # stop the timer's action if it's still waiting
"""
第一个参念宏数时指定多长时间之后执行这个函数,第二个参数时调用的函数名,
后面两个是可选函数,作为传递函数需要使用的参数,可以传递普拍陵通的参数和字典
t.start() 启动这个定时任务,也可以使用t.cancel()在一定的条件来停止这个定时任务,
下面这行代码表示十秒钟后调用一次views_count这个函数
Timer(10, views_count).start()
H. 简单强大的Python库!Schele—实用的周期任务调度工具
如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点:
1.不方便执行 秒级的任务 。
2.当需要执行的定时任务有上百个的时候,Crontab的 管理就会特别不方便 。
另外一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。
在你想要使用一个轻量级的任务调度工具,而且希望它尽量简单、容易使用、不需要外部依赖,最好能够容纳 Crontab 的所有基本功能,那么 Schele 模块是你的不二之选。
使用它来调度任务可能只需要几行代码,感受一下:
上面的代码表示每10分钟执行一次 job 函数,非常简单方便。你只需要引入 schele 模块,通过调用 scele.every(时间数).时间类型.do(job) 发布周期任务。
发布后的周期任务需要用 run_pending 函数来检测是否执行,因此需要一个 While 循环不断地轮询这个函数。
下面具体讲讲Schele模块的安装和初级、进阶使用方法。
1.准备
请选择以下任一种方式输入命令安装依赖 :
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
2.基本使用
最基本的使用在文首已经提到过,下面给大家展示更多的调度任务例子:
可以看到,从月到秒的配置,上面的例子都覆盖到了。不过 如果你想只运行一次任务 的话,可以这么配:
参数传递
如果你有参数需要传递给作业去执行,你只需要这么做:
获取目前所有的作业
如果你想获取目前所有的作业:
取消所有作业
如果某些机制触发了,你需要立即清除当前程序的所有作业:
标签功能
在设置作业的时候,为了后续方便管理作业,你可以给作业打个标签,这样你可以通过标签过滤获取作业或取消作业。
设定作业截止时间
如果你需要让某个作业到某个时间截止,你可以通过这个方法:
截止日期之后,该作业将无法运行。
立即运行所有作业,而不管其安排如何
如果某个机制触发了,你需要立即运行所有作业,可以调用 schele.run_all :
3.高级使用
装饰器安排作业
如果你觉得设定作业这种形式太啰嗦了,也可以使用装饰器模式:
并行执行
默认情况下,Schele 按顺序执行所有作业。其背后的原因是,很难找到让每个人都高兴的并行执行模型。
不过你可以通过多线程的形式来运行每个作业以解决此限制:
日志记录
Schele 模块同时也支持 logging 日志记录,这么使用:
效果如下:
异常处理
Schele 不会自动捕捉异常,它遇到异常会直接抛出,这会导致一个严重的问题: 后续所有的作业都会被中断执行 ,因此我们需要捕捉到这些异常。
你可以手动捕捉,但是某些你预料不到的情况需要程序进行自动捕获,加一个装饰器就能做到了:
这样, bad_task 在执行时遇到的任何错误,都会被 catch_exceptions 捕获,这点在保证调度任务正常运转的时候非常关键。
I. python1小时内不重复发送
python1小时内不重复发送的原因。
1、python中有一个轻量级的定时任务调度的库:schele。
2、它可以完成每分钟,每小时,每天,周几,特定含宴日期的定时任务,不会重复发送内洞老唤容,十分方便我们执纳凯行一些轻量级的定时任务。
J. python动态添加删除定时任务
可以基于tornado-APScheler实现添加动态添加/删除/暂停/清除定时任务。
安装:pip3 install apsheler
1.任何调度器在开始后,不能再次start。不然会出现异常
2.shutdown方法:终结掉对应的调度器,所以代码逻辑里需要检测一下. running方法可以判断调度器的运行状态,如果需要设计delete方法清除某个任务,建议用remove方法,对应代码逻辑需要注意start()不要重复
3.注意BlockingScheler,如果你想动态添加任务的话,这个调度器是阻塞的,所以每个任务必须是一个守护线程,个人感觉不太方便,建议用其他非阻塞的
4. get_jobs()方法很有用,如果我们加上dir,配合这个方法可以很灵活地配置
5.修改一个周期任务,需要用modify_job方法,根据你的job_id修改
Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。