sched 模块中巨好用的轻量级定时任务神器scheduler!

Posted Python 集中营

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sched 模块中巨好用的轻量级定时任务神器scheduler!相关的知识,希望对你有一定的参考价值。

Python 提供有一个强大的、可用来定义执行任务调度的 sched 模块,该模块中含有一个 scheduler 类,可用来执行更复杂的任务调度。

【阅读全文】

这种定时调度任务的实现还是比较简单的,总体来说只需要编写好定时任务最好使用标准范式来使得任务运行起来。

首先,需要导入三个模块的扩展库。主要是为了两个方面,一个是为了记录时间或者日期准备的,另一个则是为了执行编写好的任务。

import sched # 定时任务模块
import time # 时间模块
from datetime import datetime # 日期时间模块

接下来主要看一下执行定时任务的函数,就是通过这个函数最后将定时任务可以调度起来执行的,看一下这个调度函数的组成部分。

\'\'\'
初始化scheduler类对象
time.time 可以返回时间戳的函数
time.sleep 实现运行阻塞等待
用time模块的这两个函数来实例化scheduler对象
\'\'\'
schedule = sched.scheduler(time.time, time.sleep)

第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。

编写一个任务用于执行。

def work(cycle):
    \'\'\'
    定义需要执行的工作任务
    :param cycle: 时间周期,单位:秒
    :return:
    \'\'\'
    print(\'当前执行时间:\',datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    # 将任务函数加到定时任务中
    schedule.enter(cycle, 0, work, (cycle,))
    print(\'任务执行状态:\', \'success\')

函数介绍:enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数。

最后,编写调起上述任务的触发函数,通过触发上面已经写好的定时任务来完成定时任务的执行。

def exec_work(cycle=10):
    # 添加触发函数
    schedule.enter(0, 0, work, (cycle,))
    # 启动任务
    schedule.run()

再通过main的函数入口执行exec_work函数,这样一个定时任务的调度就算完成了。

if __name__ == \'__main__\':
    exec_work(1)

【往期精彩】

● 不用再使用命令行打包成exe,有人写出了UI应用,可视化UI界面对python程序进行打包的方法!

● 发现一个秘密:既python3.6之后字典竟然变成了有序集合,我再次验证了一下!

● 大厂校招白菜打包价40W+,可高兴坏了房东大妈...

● 这么多的内置函数能记住吗?对python的68个内置函数分类总结!

● 必须要会的文件操作对象File,python文件读写操作利器!

● 你不知道的CS模式的进程管理工具,状态监测、项目启停一目了然!

● 如何将一个python应用以docker镜像的方式来运行?

● python-celery专注于实现分布式异步任务处理、任务调度的插件!

● python远程服务操作工具:fabric,远程命令、本地命令、服务器操作利器!

● python超赞插件you-get,执行一行命令即可下载、命令行下载工具推荐!

● 办公自动化:Python-win32com自动将word文档转换成pdf格式!

● Git LFS 3.0.0 发布,对大文件进行版本控制的 Git 扩展

欢迎关注作者公众号【Python 集中营】,专注于后端编程,每天更新技术干货,不定时分享各类资料!

python定时任务-sched模块

通过sched模块可以实现通过自定义时间,自定义函数,自定义优先级来执行函数。
范例一
 1 import time
 2 import sched
 3 
 4 schedule = sched.scheduler( time.time,time.sleep)
 5 
 6 def func(string1):
 7     print "now excuted func is %s"%string1
 8 
 9 print "start"
10 schedule.enter(2,0,func,(1,))
11 schedule.enter(2,0,func,(2,))
12 schedule.enter(3,0,func,(3,))
13 schedule.enter(4,0,func,(4,))
14 schedule.run()
15 
16 print "end"
schedule是一个对象,叫什么名字都可以
schedule.enter(delay,priority,action,arguments)
第一个参数是一个整数或浮点数,代表多少秒后执行这个action任务
第二个参数priority是优先级,0代表优先级最高,1次之,2次次之,当
两个任务是预定在同一个时刻执行时,根据优先级决定谁先执行。
第三个参数就是你要执行的任务,可以简单理解成你要执行任务的函数的函数名
第四个参数是你要传入这个定时执行函数名函数的参数,最好用括号包起来,如果只传入一个
参数的时候用括号包起来,该参数后面一定要加一个逗号,如果不打逗号,会出现错误。
例如schedule.enter(delay, priority, action, (argument1,))
 
run()一直被阻塞,直到所有任务全部执行结束。每个任务在同一线程中运行,所以如果一个任务执行时间大于
其他任务的等待时间,那么其他任务会推迟任务的执行时间,这样保证没有任务丢失,但这些任务的调用时间会比设定的推迟。
 
多线程执行定时任务
范例二
1 import time
2 import sched
3 from threading import Timer
4 def print_name(str):
5     print "i‘m %s"%str
6 print "start"
7 Timer(5,print_name,("superman",)).start()
8 Timer(10,print_name,("spiderman",)).start()
9 print "end"
通过多线程,实现定时任务
在多线程中,如果只通过schedule,会因为线程安全的问题会出现阻塞,一个任务执行,如果没有结束而另一个任务就要等待。
通过threading.Timer可以避免这个问题效果就是直接执行Print start和print end,而定时任务会分开执行。打印end不会阻塞。
 
 

以上是关于sched 模块中巨好用的轻量级定时任务神器scheduler!的主要内容,如果未能解决你的问题,请参考以下文章

python定时任务-sched模块

python定时任务-sched模块

python使用sched模块执行周期性任务和定时任务

python的sched模块--延时调度

太实用了,Schedule模块, Python 周期任务神器

Python定时事件 Timer & sched