提到定时任务调度的时候,相信很多人会想到celery,要么就写个脚本塞到crontab中。不过,一个小的定时脚本,要用celery的话太“重”了。所以,我找到了一个轻量级的定时任务调度的库:schedule。
任务调度,轻量级的定时任务调度的库:schedule。
库的安装还是最简单的pip install schedule,使用起来也是很容易理解的。

1. 基本使用


mport schedule
import timedef 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+1schedule.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 timedef 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 timedef 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 timedef 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 timedef 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://www.cnblogs.com/wanglinjie/p/9286323.html

python中的轻量级定时任务调度库:schedule相关推荐

  1. python scheduler cron_Python轻量级定时任务调度框架“APScheduler”

    APScheduler是Python的一个定时任务框架,用于执行周期或者定时任务,可以基于日期.时间间隔,及类似于云服务器Linux系统上的定时任务crontab类型的定时任务:该框架不仅可以添加.删 ...

  2. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  3. linux 下的动态库制作 以及在python 中如何调用 c 函数库

    linux 下的动态库制作 以及在python 中如何调用 c 函数库 动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序 ...

  4. 捋一捋Python中的数学运算math库(上篇)

    正式的Python专栏第18篇,同学站住,别错过这个从0开始的文章! 很多学习编程的都多多少少学习了一些数学知识. 学委之前也简单吐槽了 Python中奇葩的round函数! 这篇我们讲讲那些常用的数 ...

  5. python任务定时运行库 schedule 模块

    简介 轻量级的python任务定时运行库--官方文档 使用示例 import schedule import timedef job():print("I'm working..." ...

  6. Python 中 xpath 语法 与 lxml 库解析 HTML/XML 和 CSS Selector

    The lxml.etree Tutorial :https://lxml.de/tutorial.html python3 解析 xml:https://www.cnblogs.com/deadwo ...

  7. Python 中最强大的错误重试库

    作者 | 费弗里 来源丨Python大数据分析 1 简介 我们在编写程序尤其是与网络请求相关的程序,如调用web接口.运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅 ...

  8. python中读写excel的扩展库_Python读写Excel文件第三方库汇总,你想要的都在这儿!...

    常见库简介 xlrd xlrd是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件. http://xlrd.readthedocs.io/en/latest/ 1.xlrd ...

  9. python中对matlab的支持库

    1. 简介 matplotlib official website:http://matplotlib.sourceforge.net/index.html The pylab mode provid ...

最新文章

  1. docker容器内部使用vim
  2. machine learning学习笔记
  3. 联通定时休眠5G基站 戳破皇帝的新衣
  4. python 实现组合数
  5. 面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?
  6. linux lamp框架,LAMP架构协同应用的实例——phpMyAdmin
  7. android简单项目及代码_Android 开源项目 (AOSP) 代码搜索工具正式发布
  8. centos7初始化脚本
  9. Win 下面配置 memcache
  10. cad自动填写页码lisp_图框文件名称自动填写 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  11. 面向对象知识 |《C++编程思想》(《Thinking In Cpp》)阅读感受
  12. bat学习(二)快速批量建立指定三级文件夹
  13. 内蒙古等保测评机构项目测评收费价格标准参考
  14. TIPTOP、T100系统程序的内置函数使用详解
  15. centos7上装qt5.15.2
  16. 河南这么大的省,也所谓的准一线,为什么IT行业就是发展不起来呢?
  17. 变中求生 ——频繁变化的团队如何打造团队文化
  18. android 按钮点击退出程序,Android:按下后退按钮退出应用程序
  19. c/c++ 内存使用指南 和实践指导
  20. python控制画笔尺寸_Python turtle库的画笔控制说明

热门文章

  1. Qt Creator预览版
  2. C语言实现链表栈 LinkedListStack(附完整源码)
  3. C语言通过用户输入将八进制转为二进制(附完整源码)
  4. C++ deque方法
  5. QT绘制百分比条形图。
  6. QT的QScriptEngineAgent类的使用
  7. mysql 优化 类型_MySQL数据类型的优化选择
  8. 04_关于元数据,ResultSetMetaData对象以及API方法介绍
  9. easyui tree复选框是否打钩状态_实战PyQt5: 010-复选框控件QCheckBox
  10. android pc模式 刘祚虎,刘作虎:一加三段式按键安卓手机唯一 5年付出亿级成本...