提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中。不过,一个小的定时脚本,要用celery的话太“重”了。所以,我找到了一个轻量级的定时任务调度的库:schedule。
库的安装还是最简单的pip install schedule,使用起来也是很容易理解的。我们从最简单的栗子看起:
import schedule import time def job(): print("I'm working...") schedule.every(10).minutes.do(job) schedule.every().hour.do(job) schedule.every().day.at("10:30").do(job) schedule.every(5).to(10).days.do(job) schedule.every().monday.do(job) schedule.every().wednesday.at("13:15").do(job) while True: schedule.run_pending() time.sleep(1)
这是在pypi上面给出的示例。这个栗子简单到我不需要怎么解释。而且,通过这个栗子,我们也可以知道,schedule其实就只是个定时器。在while True死循环中,schedule.run_pending()是保持schedule一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟crontab是类似的。
但是,如果是多个任务运行的话,实际上它们是按照顺序从上往下挨个执行的。如果上面的任务比较复杂,会影响到下面任务的运行时间。比如我们这样:
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)
接下来你就会发现,两个定时任务并不是10秒运行一次,而是12秒。是的。由于job1和job2本身的执行时间,导致任务延迟了。
其实解决方法也很简单:用多线程/多进程。不要幼稚地问我“python中的多线程不是没有用吗?”这是两码事。开了一条线程,就把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)
就是这么简单。
唯一要注意的是,这里面job不应当是死循环类型的,也就是说,这个线程应该有一个执行完毕的出口。一是因为线程万一僵死,会是非常棘手的问题;二是下一次定时任务还会开启一个新的线程,执行次数多了就会演变成灾难。如果schedule的时间间隔设置得比job执行的时间短,一样会线程堆积形成灾难,所以,还是需要注意一下的。
schedule这个库使用起来比较简单,内容不是很多。我这里介绍的大概用法基本上够用了,还想了解其他特性的话,可以参考官网:https://schedule.readthedocs.io/en/stable/
相关推荐
python 轻量级ORM peewee
python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 ...
最新!Python轻量级数据处理库DaPy.zip,Easy-to-use data analysis / manipulation framework for humans
python定时任务 每天运行一次 在 Python 中可以使用 schedule 模块来实现定时任务。以下是一个每天运行一次的例子: import schedule import time def job(): print("I'm running at 5:00am every day.") # 设定...
今天小编就为大家分享一篇对Python定时任务的启动和停止方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
轻量级办公管理系统 系统中所演示的数据均系杜撰,并非真实数据,包括单位名称、人名、地名和通信方式。
Pyzo是一个免费开源的跨平台的Python IDE,它专注于交互和introspection,这使它非常适合科学计算。它为了简化和高效而设计。它由两个主要组件,编辑器和外壳(shell)组成,并使用一组可插拔工具来帮助程序员。可以...
功能:基于python+APScheduler的定时任务管理系统,目前定时执行的任务为获取指定网页的源码并与关键字比对,若比对通过则发送邮件通知。 开发语言及框架为后端为:python+django 安装教程 系统中完成python3安装后...
minimongo - 一个轻量级的、面向对象的Python MongoDB接口
基于Python的轻量级作业管理系统源码.zip基于Python的轻量级作业管理系统源码.zip基于Python的轻量级作业管理系统源码.zip基于Python的轻量级作业管理系统源码.zip基于Python的轻量级作业管理系统源码.zip基于Python...
incubator-airflow:定时任务管理平台,管理和调度各种离线定时任务,自带 Web 管理界面。当定时任务量达到百级别的时候,就无法再使用 crontab 有效、方便地管理这些任务了。该项目就是为了解决了这个问题而诞生的
1、Python自带模块 threading模块的Timer类或者schedule模块 2、用crontab 首先创建一个shell脚本 touch daren.sh 创建 vim daren.sh 修改 #!/bin/bash #这里python3要写绝对路径 ... 原创文章 4获赞 1访问量 3359
Python3 Huey Zreorpc Redis Flask=RTask 轻量级分布式任务管理系统
flexicon - 一种用于Python轻量级\基于正则表达式的词法分析器框架
flask是一个轻量级的Web应用框架, 使用Python编写。基于 WerkzeugWSGI工具箱和 Jinja2模板引擎。Flask使用 BSD 授权。
huey 是多线程的 Python 任务队列,是个轻量级的替代品,没有多余的依赖关系。 特性: 使用 Python 编写 没有 deps 以外的标准库,除了 Redis(或者用户可以 roll 自己的后端) 支持 Django 支持: 多线程...
使用Python的timer来完成每天执行一次的定时任务,环境是windows,python3.4
轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科轻量级爬虫-百科
基于Python实现的轻量级弹弹堂瞄准器源码.zip基于Python实现的轻量级弹弹堂瞄准器源码.zip基于Python实现的轻量级弹弹堂瞄准器源码.zip基于Python实现的轻量级弹弹堂瞄准器源码.zip 基于Python实现的轻量级弹弹堂...