文章目录
前文
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)