python中的轻量级定时任务调度库:schedule

提到定时任务调度的时候,相信很多人会想到芹菜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/

就酱。

时间: 2024-07-31 12:26:00

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

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

动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件.动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数.函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译.链接并与使用它们的进程分开存储的函数.DLL 还有助于共享数据和资源.多个应用程序可同时访问内存中单个DLL 副本的内容.DLL 是一个包含可由多个程序同时使用的代码和数据的库.Wind

在 python 中查看已安装三方库的版本号

对于已安装的三方库,有的时候需要查看一下版本号,本文记录如下内容: python的版本号 三方库的版本号 下图中的操作是在PyCharm中进行的操作,在其它的控制台中同理 1.python的版本号: python 2.三方库的版本号分为两种查找方式,一种是查找所有的安装列表,另一种是查找指定库的版本 2.1.查找所有:pip list 2.2.查找指定库的版本:pip show pandas 原文地址:https://www.cnblogs.com/rui-yang/p/11798337.htm

python中常用的函数与库一

1, collections.deque 在python里如果我们用列表作为队列使用也是可以的,只是当从队尾删除或者增加元素的时候是很快的,但是从队首删除或者增加元素则要慢得多,这是因为在队首进行操作其他的元素都要逐一改变. collections.deque就是为队列设计的,它能迅速得删除或者增加元素,无论是队首还是队尾 >>> from collections import deque >>> queue = deque(["Eric", &qu

FluentScheduler——轻量级定时任务调度

安装:FluentScheduler Install-Package FluentScheduler 一.控制台中使用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FluentScheduler; namespace ConsoleApp { class Program { static void

Python中使用pip安装一些库时出现ERROR

ERROR: No matching distribution found for tensorflow的情况这可能是因为网络的问题,这时我们使用国内的镜像源来加速输入命令:python -m pip install requests(如果你安装的是别的库,请输入别的库名) -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com这时就安装成功了. 原文地址:https://www.cnblogs.com/zhaoyang1

Python中处理HTTP协议的库:urllib2

使用Python访问网页主要有三种方式: urllib, urllib2, httplib urllib比较简单,功能相对也比较弱,httplib简单强大,但不支持session 1. 最简单的页面访问(获取服务器端的Response包) res=urllib2.urlopen(url) print res.read() 2. 加上要GET或POST的数据 data={"name":"hank", "passwd":"hjz"

python 中问题,包括某些库的问题

*)matplotlib animate中变量作用域的问题 错误提示: UnboundLocalError: local variable 'i' referenced before assignment 代码: i=0 def animate(frameno): x = mu + sigma * np.random.randn(N) n, _ = np.histogram(x, bins, normed=True) time_text.set_text(time_template%framen

scikit-opt——Python中的群体智能优化算法库

安装 pip install scikit-opt 对于当前的开发者版本: git clone [email protected]:guofei9987/scikit-opt.git cd scikit-opt pip install . Genetic Algorithm 第一步:定义你的问题 import numpy as np def schaffer(p): ''' This function has plenty of local minimum, with strong shocks

java定时任务调度工具

一.什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的时间执行次数自动执行的任务. 二.java中常用的定时任务调度工具: Timer Quartz 2.1两者区别: Timer源自jdk,Quartz需要额外引入jar包. Timer功能少,使用方便,能解决许多常见问题.Quartz功能强大,使用麻烦,能解决几乎所有问题. Timer底层通过线程执行定时任务.Quartz底层通过多个线程池执行定时任务. 2.2Timer简介 定义:有且仅有一个后台线程对多个业务线程,进行定时定频率