Python编程之定时任务(Schedule)详解

前文

c r o n t a b crontab crontab模块在python中实现定时任务Python编程之定时任务(crontab)详解

引言

虽然 c r o n t a b crontab crontab能够很好的实现定时任务,但是相较于今天要介绍的模块 s c h e d u l e schedule schedule则略显复杂。通过以下的例子可以发现 s c h e d u l e schedule schedule非常的易于使用,甚至代码不需要注解都能看懂代码,非常推荐大家使用。

基础用法

简单的例子

import schedule
import time

def job():
    print("This is a job")

# 每 2秒/分/小时/天/周 执行一次任务
schedule.every(2).seconds.do(job)
schedule.every(2).minutes.do(job)
schedule.every(2).hours.do(job)
schedule.every(2).days.do(job)
schedule.every(2).weeks.do(job)

# 每分钟的第34秒执行一次任务
schedule.every().minute.at(":34").do(job)

# 每小时的第43分执行一次任务
schedule.every().hour.at(":43").do(job)

# 每第5小时的第20分30秒执行任务
# 现在是02:00则第5个小时为06:00, 任务在06:20:30执行
schedule.every(5).hours.at("20:30").do(job)

# 在特定的时间和时区执行任务
schedule.every().day.at("10:30").do(job)
schedule.every().day.at("10:30:42").do(job)
schedule.every().day.at("12:42", "Asia/Shanghai").do(job)

# 在特定的星期/时间执行任务
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

装饰器

from schedule import every, repeat, run_pending
import time

@repeat(every(10).minutes)
def job():
    print("This is a job")

while True:
    run_pending()
    time.sleep(1)

传参

import schedule

def greet(name):
    print('Hello', name)

schedule.every(2).seconds.do(greet, name='LoveFish')
schedule.every(4).seconds.do(greet, name='LoveFishO')

from schedule import every, repeat

@repeat(every().second, "LoveFish")
@repeat(every().day, "LoveFishO")
def hello(name):
    print("Hello", name)

取消任务

import schedule

def some_task():
    print('Hello world')

job = schedule.every().day.at('22:30').do(some_task)
schedule.cancel_job(job)

只执行一次任务

import schedule
import time

def job_that_executes_once():
    print('Executes once')
    return schedule.CancelJob

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

while True:
    schedule.run_pending()
    time.sleep(1)

获取所有任务

import schedule

def hello():
    print('Hello world')

schedule.every().second.do(hello)

all_jobs = schedule.get_jobs()

取消所有任务

import schedule

def greet(name):
    print('Hello {}'.format(name))

schedule.every().second.do(greet, 'LoveFish')
schedule.every().hours.do(greet, 'LoveFishO')

# cancel all jobs
schedule.clear()

获取部分任务

通过对每个任务设定 t a g tag tag,通过 t a g tag tag过滤去获取部分任务

import schedule

def greet(name):
    print('Hello {}'.format(name))

schedule.every().day.do(greet, 'LoveFish').tag('daily-tasks', 'A')
schedule.every().hour.do(greet, 'LoveFishO').tag('hourly-tasks', 'A')
schedule.every().hour.do(greet, 'LoveFish').tag('hourly-tasks', 'B')
schedule.every().day.do(greet, 'LoveFishO').tag('daily-tasks', 'B')

A_jobs = schedule.get_jobs('A')
daily_jobs = schedule.get_jobs('daily-tasks')

取消部分任务

通过对每个任务设定 t a g tag tag,通过 t a g tag tag过滤去获取部分任务并取消

import schedule

def greet(name):
    print('Hello {}'.format(name))

schedule.every().day.do(greet, 'LoveFish').tag('daily-tasks', 'A')
schedule.every().hour.do(greet, 'LoveFishO').tag('hourly-tasks', 'A')
schedule.every().hour.do(greet, 'LoveFish').tag('hourly-tasks', 'B')
schedule.every().day.do(greet, 'LoveFishO').tag('daily-tasks', 'B')

# 取消tag中带有daily-tasks的任务
schedule.clear('daily-tasks')

# 取消tag中带有A的任务
schedule.clear('A')

在区间内随机一个时间执行任务

import schedule

def my_name():
    print('LoveFishO')

# 每5-10秒执行一次任务
schedule.every(5).to(10).seconds.do(my_name)
# 每5-10小时执行一次任务
schedule.every(5).to(10).hours.do(my_name)

直到一个确定时间再执行任务

import schedule
from datetime import datetime, timedelta, time

def job():
    print('LoveFishO')

# 每一小时执行一次任务,但是直到今天的18:30才会执行
schedule.every(1).hours.until("18:30").do(job)

# 直到2030-01-01 18:33才会执行
schedule.every(1).hours.until("2030-01-01 18:33").do(job)

# 在接下来的8小时内每小时执行一次
# 如现在是02:00, 下一次执行时间为03:00, 以此类推
schedule.every(1).hours.until(timedelta(hours=8)).do(job)

# 直到今天的11:33:42才会执行
schedule.every(1).hours.until(time(11, 33, 42)).do(job)

# 直到2020-05-17 11:36:20才会执行
schedule.every(1).hours.until(datetime(2020, 5, 17, 11, 36, 20)).do(job)

执行所有任务忽略计划

import schedule

def name1():
    print('LoveFish')

def name2():
    print('LoveFishO')

schedule.every().monday.at("12:40").do(name1)
schedule.every().tuesday.at("16:40").do(name2)

# 立刻执行所有任务
schedule.run_all()

# 增加任务之间执行的间隔
schedule.run_all(delay_seconds=10)

执行每两周(第一周)执行一次任务

import datetime
import schedule

START_DATE = datetime.date.today()

def job():
	print('This is a job')

def custom_job(interval):
    current_date = datetime.date.today()
    delta = current_date - START_DATE
    weeks = delta.days // 7
    if weeks % interval == 0:
        job()

# 每两周三的第一周的上午11:00执行一次任务
schedule.every().wednesday.at("11:00", 'Asia/Shanghai').do(custom_job, 2)

Reference

schedule官方文档

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值