首页 > 编程语言 >python3的schedule模块

python3的schedule模块

时间:2023-09-19 16:46:21浏览次数:39  
标签:do schedule job every def 模块 import python3

一、schedule模块:

1、基本操作:

import schedule

import time

 

def hello(name):

    print("hello %s" % name)

 

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)

 

schedule.every(5).seconds.do(hello,"kevin")

 

while True:

    schedule.run_pending()

    time.sleep(1)

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

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

2、只执行一次

不过如果你想只运行一次任务的话,可以这么配:

import schedule

import time

 

def job_that_executes_once():

    # 此处编写的任务只会执行一次...

    return schedule.CancelJob

 

schedule.every().day.at('22:30').do(job_that_executes_once)

 

while True:

    schedule.run_pending()

    time.sleep(1)

 

3、获取所有作业:

all_jobs = schedule.get_jobs()

print(all_jobs)

4、取消所有作业:

schedule.clear()

 

5、通过标签获取或取消部分作业:

# .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')

 

6、设定作业截止时间:

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)

 

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

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)

 

8、装饰器安排作业

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_pending()

    time.sleep(1)

 

 

9、并行执行

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

import threading

import time

import schedule

 

def 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.start()

 

schedule.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_pending()

    time.sleep(1)

 

10、日志记录

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

import schedule

import logging

 

logging.basicConfig()

schedule_logger = logging.getLogger('schedule')

# 日志级别为DEBUG

schedule_logger.setLevel(level=logging.DEBUG)

 

def job():

    print("Hello, Logs")

 

schedule.every().second.do(job)

 

schedule.run_all()

 

schedule.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

 

11、异常处理

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

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

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 捕获,这点在保证调度任务正常运转的时候非常关键。

 

 

标签:do,schedule,job,every,def,模块,import,python3
From: https://www.cnblogs.com/wushank/p/17715066.html

相关文章

  • BOSHIDA DC电源模块具有不同的安装方式和安全规范
    三河博电科技BOSHIDADC电源模块具有不同的安装方式和安全规范DC电源模块是将低压直流电转换为需要的输出电压的装置。它们广泛应用于各种领域和行业,如通信、医疗、工业、家用电器等。安装DC电源模块应严格按照相关的安全规范进行,以确保其正常运行和安全使用。 DC电源模块的......
  • Ansible-常用模块(二)
    Ansible命令格式ansible清单-m模块-a模块参数–version:显示版本-mmodule:指定模块,默认为command模块-v:显示详细过程-vv-vvv更详细过程–list:显示主机列表,也可以用–list-hosts-k:提示输入ssh连接密码,默认key认证-C:预执行检测-T:执行命令超时时间,默认为10s-u:指定远......
  • 迭代器、生成器、模块和包知识点总结
    第一部分:迭代器 例1. for....in运行机制li=[1,2,3,4]#在列表中取值从第一个取到最后一个结束#foriinli:#print(i)#1,2,3,4i=0whilei<len(li):#索引#print(i)#输出索引0,1,2,3print(li[i])#取列表值i+=1print(i)#i=4的时......
  • 强制卸载目标进程模块
    代码来源于网络,卸载模块后通过查询PEB得到进程信息的程序没有得到更新,(如:Windows优化大师和360的进程查看),可以通过冰刃查看。注:强制卸载可能导致目标进程崩溃。哈哈,又有了种结束进程的方式,卸载目标进程的ntdll.dll。下面是代码:classForceQuit{public:boolEnablePriv()......
  • 用ZwQueryVirtualMemory枚举进程模块
    用ZwQueryVirtualMemory枚举进程模块枚举进程模块通常可以使用诸如:CreateToolhelp32Snapshot,Module32First,Module32Next等"ToolHelpFunctions"接口来实现,并且这也是最通用的方法(从Win95就开始支持了),但是今天我们要介绍的是ntdll.dll导出的未文档化接口ZwQueryVirtualM......
  • Python3 ACM模式的输入输出处理
    python3ACM模式的输入输出例子教学_amc模式python读取输入_汀、人工智能的博客-CSDN博客Python的输入是字符串,所以要自己转类型strip去掉左右两端的空白符,返回strslipt把字符串按空白符拆开,返回[str]map把list里面的值映射到指定类型,返回[type]EOF用抓异常print后面加逗号......
  • 前端模块化
     1.为什么需要模块化随着前端应用的日益复杂,我们的项目代码已经逐渐膨胀到了不得不花大量时间去管理的程度了。而模块化就是一种最主流的代码组织方式,它通过把复杂的代码按照功能的不同划分为不同的模块单独维护,从而提高开发效率、降低维护成本。模块化可以使你能够更容易地重......
  • Node.js URL 模块:解析和操作 URL
    任何基于Web的应用程序不可或缺的方面之一是其有效使用URL的能力。无论是解析传入的URL还是构建URL来发出请求,清楚地了解Node.js中的URL模块对于现代Web开发人员来说至关重要。在这篇博文中,我们将探索Node.js的URL模块,从基本的URL解析开始,逐步推进到更复杂的......
  • JavaScript 模块之间的差异:CJS、AMD、UMD 和 ESM
    JavaScript的世界是一个不断发展和发展的技术领域。多年来,开发人员尝试使用不同的模块系统来提供更有组织性和协作性的工作环境。在这篇博文中,我们将研究四种流行的JavaScript模块系统之间的差异:CommonJS(CJS)、异步模块定义(AMD)、通用模块定义(UMD)和ECMAScript模块(ES......
  • RK3568开发板外接超声波传感器测距模块-迅为电子
    超声波传感器测距模块1模块说明HC-SR04传感器模块如下图所示:   只需要在 Trig 管脚输入一个 10US 以上的高电平,系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。当检测到回波信号后,通过 Echo 管脚输出。根据 Echo管脚输出高电平的持续时间可以计算距离值,......