admin管理员组文章数量:1566223
提到定时任务调度的时候,相信很多人会想到celery,要么就写个脚本塞到crontab中。不过,一个小的定时脚本,要用celery的话太“重”了。所以,我找到了一个轻量级的定时任务调度的库:schedule。
任务调度,轻量级的定时任务调度的库:schedule。
库的安装还是最简单的pip install schedule,使用起来也是很容易理解的。
1. 基本使用
mport schedule
import time
def job():
print("I'm working...")
def job2():
print("I'm working... in job2")
#schedule.every(10).minutes.do(job) # 每10分钟执行一次job函数
#schedule.every(10).seconds.do(job) # 每10秒执行一次job函数
#schedule.every().hour.do(job) # 当every()没参数时默认是1小时/分钟/秒执行一次job函数
schedule.every().day.at("15:29").do(job) # 在每天10:30执行job函数
#schedule.every(5).to(10).days.do(job)
#schedule.every(5).to(10).seconds.do(job) # 每隔5秒和10秒执行job工作
#schedule.every().monday.do(job) # 每周一执行
#schedule.every().wednesday.at("13:15").do(job) # 具体某一天某个时刻执行一次job函数
#schedule.every(10).seconds.do(job2) # 可以同时定时执行多个任务,但是每个任务是按顺序执行
i=0
while True:
i=i+1
schedule.run_pending()
time.sleep(1)
print(i)
运行:
...
44
45
46
47
48
49
50
51
52
53
I'm working...
54
55
56
...
"15:29"是我自己定的,可以看到定点运行了。
通过这个栗子,我们也可以知道,schedule其实就只是个定时器。在while True死循环中,schedule.run_pending()是保持schedule一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟crontab是类似的。
2. 多任务运行
但是,如果是多个任务运行的话,实际上它们是按照顺序从上往下挨个执行的。如果上面的任务比较复杂,会影响到下面任务的运行时间。比如我们这样:
import datetime
import schedule
import time
def job1():
print("I'm working for job1")
time.sleep(2)
print("job1:", datetime.datetime.now())
def job2():
print("I'm working for job2")
time.sleep(2)
print("job2:", datetime.datetime.now())
def run():
schedule.every(10).seconds.do(job1)
schedule.every(10).seconds.do(job2)
while True:
schedule.run_pending()
time.sleep(1)
run()
运行:
I'm working for job1
job1: 2018-11-23 15:38:19.917520
I'm working for job2
job2: 2018-11-23 15:38:21.919624
I'm working for job1
job1: 2018-11-23 15:38:31.944652
I'm working for job2
job2: 2018-11-23 15:38:34.954488
I'm working for job1
job1: 2018-11-23 15:38:43.980233
I'm working for job2
job2: 2018-11-23 15:38:46.986861
I'm working for job1
job1: 2018-11-23 15:38:56.008891
I'm working for job2
job2: 2018-11-23 15:38:59.013363
I'm working for job1
job1: 2018-11-23 15:39:08.032680
I'm working for job2
job2: 2018-11-23 15:39:11.034983
接下来你就会发现,两个定时任务并不是10秒运行一次,而是12秒。是的。由于job1和job2本身的执行时间,导致任务延迟了。
其实解决方法也很简单:用多线程/多进程。开了一条线程,就把job独立出去运行了,不会占主进程的cpu时间,schedule并没有花掉执行一个任务的时间,它的开销只是开启一条线程的时间,所以,下一次执行就变成了10秒后而不是12秒后。
import datetime
import schedule
import threading
import time
def job1():
print("I'm working for job1")
time.sleep(2)
print("job1:", datetime.datetime.now())
def job2():
print("I'm working for job2")
time.sleep(2)
print("job2:", datetime.datetime.now())
def job1_task():
threading.Thread(target=job1).start()
def job2_task():
threading.Thread(target=job2).start()
def run():
schedule.every(10).seconds.do(job1_task)
schedule.every(10).seconds.do(job2_task)
while True:
schedule.run_pending()
time.sleep(1)
run()
这里运行感觉还是有点问题的。。
注意:唯一要注意的是,这里面job不应当是死循环类型的,也就是说,这个线程应该有一个执行完毕的出口。一是因为线程万一僵死,会是非常棘手的问题;二是下一次定时任务还会开启一个新的线程,执行次数多了就会演变成灾难。如果schedule的时间间隔设置得比job执行的时间短,一样会线程堆积形成灾难,所以,还是需要注意一下的。
另一个例子:
import datetime
import schedule
import time
def job1():
print("I'm working for job1")
time.sleep(2)
print("job1:", datetime.datetime.now())
def job2():
print("I'm working for job2")
time.sleep(2)
print("job2:", datetime.datetime.now())
def run():
schedule.every().day.at("22:19").do(job1)
schedule.every().day.at("22:19").do(job2)
#schedule.every(3).seconds.do(job1)
#schedule.every(3).seconds.do(job2)
while True:
schedule.run_pending()
time.sleep(1)
if __name__ == "__main__":
run()
又一个多线程的例子:
import datetime
import schedule
import threading
import time
def job1():
print("I'm working for job1")
time.sleep(2)
print("job1:", datetime.datetime.now())
def job2():
print("I'm working for job2")
time.sleep(2)
print("job2:", datetime.datetime.now())
def job1_task():
threading.Thread(target=job1).start()
def job2_task():
threading.Thread(target=job2).start()
def run():
schedule.every().day.at("22:23").do(job1_task)
schedule.every().day.at("22:23").do(job2_task)
#schedule.every(3).seconds.do(job1_task)
#schedule.every(3).seconds.do(job2_task)
while True:
schedule.run_pending()
time.sleep(1)
if __name__ == "__main__":
run()
转发:https://wwwblogs/wanglinjie/p/9286323.html
版权声明:本文标题:python中的轻量级定时任务调度库:schedule 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725782200a1042321.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论