如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点:

1.不方便执行秒级的任务

2.当需要执行的定时任务有上百个的时候,Crontab的管理就会特别不方便

另外一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。

在你想要使用一个轻量级的任务调度工具,而且希望它尽量简单、容易使用、不需要外部依赖,最好能够容纳 Crontab 的所有基本功能,那么 Schedule 模块是你的不二之选。

使用它来调度任务可能只需要几行代码,感受一下:

# Python 实用宝典
import schedule
import time
def job:
print("I'm working...")
schedule.every(10).minutes.do(job)
while True:
schedule.run_pending
time.sleep(1)

上面的代码表示每10分钟执行一次 job 函数,非常简单方便。你只需要引入 schedule 模块,通过调用 scedule.every(时间数).时间类型.do(job)发布周期任务。

发布后的周期任务需要用 run_pending函数来检测是否执行,因此需要一个While循环不断地轮询这个函数。

下面具体讲讲Schedule模块的安装和初级、进阶使用方法。

1.准备

请选择以下任一种方式输入命令安装依赖

1. Windows 环境 打开 Cmd (开始-运行-CMD)。

2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。

3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install schedule

2.基本使用

最基本的使用在文首已经提到过,下面给大家展示更多的调度任务例子:

# Python 实用宝典
import schedule
import time
def job:
print("I'm working...")
# 每十分钟执行任务schedule.every(10).minutes.do(job)
# 每个小时执行任务schedule.every.hour.do(job)
# 每天的10:30执行任务
schedule.every.day.at("10:30").do(job)
# 每个月执行任务schedule.every.monday.do(job)
# 每个星期三的13:15分执行任务
schedule.every.wednesday.at("13:15").do(job)
# 每分钟的第17秒执行任务schedule.every.minute.at(":17").do(job)
while True:
schedule.run_pending
time.sleep(1)

可以看到,从月到秒的配置,上面的例子都覆盖到了。不过如果你想只运行一次任务的话,可以这么配:

# Python 实用宝典
import schedule
import timedef job_that_executes_once:# 此处编写的任务只会执行一次...return schedule.CancelJob
schedule.every.day.at('22:30').do(job_that_executes_once)
while True:
schedule.run_pendingtime.sleep(1)

参数传递

如果你有参数需要传递给作业去执行,你只需要这么做:

# Python 实用宝典
import schedule
def greet(name):
print('Hello', name)
# do 将额外的参数传递给job函数
schedule.every(2).seconds.do(greet, name='Alice')
schedule.every(4).seconds.do(greet, name='Bob')

获取目前所有的作业

如果你想获取目前所有的作业:

# Python 实用宝典
import schedule
def hello:print('Hello world')
schedule.every.second.do(hello)all_jobs = schedule.get_jobs

取消所有作业

如果某些机制触发了,你需要立即清除当前程序的所有作业:

# Python 实用宝典
import scheduledef greet(name):print('Hello {}'.format(name))
schedule.every.second.do(greet)
schedule.clear

标签功能

在设置作业的时候,为了后续方便管理作业,你可以给作业打个标签,这样你可以通过标签过滤获取作业或取消作业。

# Python 实用宝典
import scheduledef greet(name):print('Hello {}'.format(name))
# .tag 打标签schedule.every.day.do(greet, 'Andrea').tag('daily-tasks', 'friend')
schedule.every.hour.do(greet, 'John').tag('hourly-tasks', 'friend')
schedule.every.hour.do(greet, 'Monica').tag('hourly-tasks', 'customer')
schedule.every.day.do(greet, 'Derek').tag('daily-tasks', 'guest')
# get_jobs(标签):可以获取所有该标签的任务friends = schedule.get_jobs('friend')
# 取消所有 daily-tasks 标签的任务schedule.clear('daily-tasks')

设定作业截止时间

如果你需要让某个作业到某个时间截止,你可以通过这个方法:

# Python 实用宝典
import schedule
from datetime import datetime, timedelta, time
def job:
print('Boo')
# 每个小时运行作业,18:30后停止
schedule.every(1).hours.until("18:30").do(job)
# 每个小时运行作业,2030-01-01 18:33 today
schedule.every(1).hours.until("2030-01-01 18:33").do(job)
# 每个小时运行作业,8个小时后停止
schedule.every(1).hours.until(timedelta(hours=8)).do(job)
# 每个小时运行作业,11:32:42后停止
schedule.every(1).hours.until(time(11, 33, 42)).do(job)
# 每个小时运行作业,2020-5-17 11:36:20后停止
schedule.every(1).hours.until(datetime(2020, 5, 17, 11, 36, 20)).do(job)

截止日期之后,该作业将无法运行。

立即运行所有作业,而不管其安排如何

如果某个机制触发了,你需要立即运行所有作业,可以调用 schedule.run_all:

# Python 实用宝典
import schedule
def job_1:
print('Foo')
def job_2:
print('Bar')
schedule.every.monday.at("12:40").do(job_1)
schedule.every.tuesday.at("16:40").do(job_2)
schedule.run_all
# 立即运行所有作业,每次作业间隔10秒
schedule.run_all(delay_seconds=10)

3.高级使用

装饰器安排作业

如果你觉得设定作业这种形式太啰嗦了,也可以使用装饰器模式:

# Python 实用宝典
from schedule import every, repeat, run_pending
import time
# 此装饰器效果等同于 schedule.every(10).minutes.do(job)
@repeat(every(10).minutes)
def job:
print("I am a scheduled job")
while True:
run_pendingtime.sleep(1)

并行执行

默认情况下,Schedule 按顺序执行所有作业。其背后的原因是,很难找到让每个人都高兴的并行执行模型。

不过你可以通过多线程的形式来运行每个作业以解决此限制:

# Python 实用宝典
import threadingimport timeimport scheduledef job1:print("I'm running on thread %s" % threading.current_thread)
def job2:print("I'm running on thread %s" % threading.current_thread)
def job3:print("I'm running on thread %s" % threading.current_thread)
def run_threaded(job_func):job_thread = threading.Thread(target=job_func)job_thread.startschedule.every(10).seconds.do(run_threaded, job1)
schedule.every(10).seconds.do(run_threaded, job2)
schedule.every(10).seconds.do(run_threaded, job3)
while True:
schedule.run_pendingtime.sleep(1)

日志记录

Schedule 模块同时也支持 logging 日志记录,这么使用:

# Python 实用宝典
import schedule
import logginglogging.basicConfigschedule_logger = logging.getLogger('schedule')
# 日志级别为DEBUGschedule_logger.setLevel(level=logging.DEBUG)def job:print("Hello, Logs")
schedule.every.second.do(job)schedule.run_allschedule.clear

效果如下:

DEBUG:schedule:Running *all* 1 jobs with 0s delay in between
DEBUG:schedule:Running job Job(interval=1, unit=seconds, do=job, args=, kwargs={})
Hello, Logs
DEBUG:schedule:Deleting *all* jobs

异常处理

Schedule 不会自动捕捉异常,它遇到异常会直接抛出,这会导致一个严重的问题:后续所有的作业都会被中断执行,因此我们需要捕捉到这些异常。

你可以手动捕捉,但是某些你预料不到的情况需要程序进行自动捕获,加一个装饰器就能做到了:

# Python 实用宝典
import functools
def catch_exceptions(cancel_on_failure=False):
def catch_exceptions_decorator(job_func):
@functools.wraps(job_func)
def wrapper(*args, **kwargs):
try:
return job_func(*args, **kwargs)
except:
import traceback
print(traceback.format_exc)
if cancel_on_failure:
return schedule.CancelJob
return wrapper
return catch_exceptions_decorator
@catch_exceptions(cancel_on_failure=True)
def bad_task:
return 1 / 0
schedule.every(5).minutes.do(bad_task)

这样,bad_task在执行时遇到的任何错误,都会被catch_exceptions 捕获,这点在保证调度任务正常运转的时候非常关键。

最后祝大家天天进步!!学习Python最重要的就是心态。我们在学习过程中必然会遇到很多难题,可能自己想破脑袋都无法解决。这都是正常的,千万别急着否定自己,怀疑自己。如果大家在刚开始学习中遇到困难,想找一个python学习交流环境,可以加入我们,领取学习资料、一起讨论。

简单强大的Python库:Schedule—实用的周期任务调度工具相关推荐

  1. Schedule—简单实用的 Python 周期任务调度工具

    https://blog.csdn.net/liao392781/article/details/80521194 python中有一个轻量级的定时任务调度的库:schedule.他可以完成每分钟,每 ...

  2. 10个优秀的Python库,实用且有趣

    为什么这么多人选择学习python?首先,python是一门全场景编程语言,对于初学编程的人而言,选择一门全场景编程语言是非常不错的选择;其次,python语言简单易学,对初学者十分友好,即便没有任何 ...

  3. garch预测 python_数据科学方面的Python库,实用!

    作者:Python开发与大数据人工智能原文:公众号 Python开发与大数据人工智能 Python是一种很棒的编程语言.事实上,它还是世界上发展最快的编程语言之一.它一次又一次证明了它在数据科学职位中 ...

  4. 爽啊,这么多有趣好玩强大的 Python 库

    Python语言简洁.易读以及可扩展,在国内外用 Python 做研究的非常多. Python 语言向来以丰富的第三方库而闻名.这么多有趣好玩且强大,靠一个人去寻找太难了. 最近粉丝群小伙伴们又罗列了 ...

  5. python 可视化界面_给大家分享一些实用的Python库

    halo,大家好,我是特仑苏,今天给大家分享一些Python库,希望可以给大家带来一些用处! 原作者:http://itGap.ru 原出处:作品文(十大主要Python库)/网站名称(zen.yan ...

  6. python 引用库的点.号_给大家分享一些实用的Python库

    halo,大家好,我是特仑苏,今天给大家分享一些Python库,希望可以给大家带来一些用处! Python附带了几个预打包的库.但是,还有许多其他库可用于高级解释通用编程语言.您还可以从中了解异步Py ...

  7. 100个相见恨晚的Python库(建议收藏)

    大家好,我是一行 在python程序员成为大神之前,都不可避免的都要做一段时间的调包侠 那就算是调包侠也都会有自己调包秘籍,拿出来能让他人感叹"相见恨晚"的那种 Awesome P ...

  8. 100个相见恨晚的Python库

    大家好,我是一行 在python程序员成为大神之前,都不可避免的都要做一段时间的调包侠 那就算是调包侠也都会有自己调包秘籍,拿出来能让他人感叹"相见恨晚"的那种 Awesome P ...

  9. 2021年最有用的数据清洗 Python 库

    作者 | 周萝卜 来源 | 萝卜大杂烩 大多数调查表明,数据科学家和数据分析师需要花费 70-80% 的时间来清理和准备数据以进行分析. 对于许多数据工作者来说,数据的清理和准备也往往是他们工作中最不 ...

最新文章

  1. R语言ggplot2可视化分组散点图、使用scale_shape_manual函数、scale_color_manual函数、scale_size_manual函自定义设置分组散点的形状、大小、颜色
  2. 服务器购买是有无系统,买服务器含不含操作系统
  3. 刚安装的python如何使用-Anaconda介绍、安装及使用教程
  4. linux java平台,如何下载和安装用于 Linux 平台的 Java
  5. 【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......
  6. linux-搜索查找类
  7. 64位处理器_电脑操作系统的32位和64位有什么区别
  8. js_!和!!的使用
  9. Android Studio下“Error:Could not find com.android.tools.build:gradle:2.2.1”的解决方法
  10. Spring配置bean文件的底层实现方式
  11. 04-AskDoctorForHelp-向医生寻求帮助
  12. java高级能力_java高级技术工程师该具备哪些能力?
  13. 利用THINKPHP框架开发的自定义表单及数据字典模板
  14. justinmind夜话:数据母板系列视频教程之原型设计二十一条军规
  15. 【android】喜马拉雅FM sdk使用
  16. 论文笔记:Revisiting Temporal Modeling for Video Super-resolution(重新审视视频超分辨率的时间建模) Part1 系咁嘅啦
  17. eccv 2018 image caption generation论文导读
  18. 计算机c语言入门.ppt,计算机c语言入门经典
  19. CTSC2016时空旅行
  20. scratch3.0加载自己的作品最新版

热门文章

  1. 怎样恢复手机备忘录的里误删的内容?
  2. dstwo linux 模拟器,dstwo sfc模拟器插件Catsfc使用教程
  3. 怎么处理Win10系统更新提示代码0x80070057的错误?
  4. Android手机9008模式刷机教程(以小米手机为例)
  5. 4款能够辅助你轻松完成工作的电脑软件推荐
  6. PHP科大讯飞翻译API接口接入
  7. 写在OI退役后和高中毕业前的一些话
  8. 移动端H5 富文本编辑器
  9. (六)Linux 4G模块Text格式和PDU格式实现中英文短信发送
  10. dp(动态规划)--学习笔记(day1)