Python通过schedule调度模块实现任务定时执行

python通过schedule调度模块实现任务定时执行

基本用法:
import schedule
import time
from datetime import datetime


def job():
    #print("I'm working...")
    now = datetime.now()
    time = now.strftime("%H:%M:%S")
    print (f'现在的时间是: {time}')

#schedule.every().second.do(job)   # 每秒执行执行一次
#schedule.every(2).seconds.do(job)   # 每2秒执行一次
schedule.every().minute.do(job)   # 每分钟执行一次
#schedule.every(10).minutes.do(job)   # 每10分钟执行一次
#schedule.every().hour.do(job)   # 每小时执行一次
#schedule.every().day.at("10:30").do(job)   # 每天10:30执行一次
#schedule.every().monday.do(job)   # 每周一执行一次
#schedule.every().wednesday.at("13:15").do(job)   # 每周三13:15执行一次

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

输出结果:

现在的时间是: 16:11:13
现在的时间是: 16:12:13
注意要点 :

(1)schedule方法是串行的,也就是说,如果各个任务之间时间不冲突,那是没问题的;如果时间有冲突的话,会串行的执行命令

import schedule
import time
import threading

def job():
    print("I'm working... in job1  start")
    time.sleep(15)
    print("I'm working... in job1  end")

def job2():
    print("I'm working... in job2")

schedule.every(10).seconds.do(job)
schedule.every(10).seconds.do(job2)

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

输出结果:

I’m working… in job1 start 
I’m working… in job1 end 
I’m working… in job2

(2)如果要多线程并发运行 可以通过多线程方式实现

import schedule
import time
import threading

def job():
    print("I'm working... in job1  start")
    time.sleep(15)
    print("I'm working... in job1  end")

def job2():
    print("I'm working... in job2")

def run_threaded(job_func):
     job_thread = threading.Thread(target=job_func)
     job_thread.start()

 schedule.every(10).seconds.do(run_threaded,job)
 schedule.every(10).seconds.do(run_threaded,job2)


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

输出结果:

I'm working... in job1  start
I'm working... in job2
I'm working... in job1  start
I'm working... in job2
I'm working... in job1  end
I'm working... in job1  start
I'm working... in job2

(3)如果需要对调度函数传参

import schedule
import time
 
def job(name):
    print("her name is : ", name)
 
name = "xiaona"
schedule.every(10).minutes.do(job, name)
schedule.every().hour.do(job, name)
schedule.every().day.at("10:30").do(job, name)
schedule.every(5).to(10).days.do(job, name)
schedule.every().monday.do(job, name)
schedule.every().wednesday.at("13:15").do(job, name)
 
while True:
    schedule.run_pending()
    time.sleep(1)
疑问解答:

while True中的代码是什么意思?很简单,如果你去掉while True这个死循环的话,schedule.run_pending()是没有办法持续运行的,那么schedule.run_pending()是个什么东西呢?

schedule其实就只是个定时器。在while True死循环中,schedule.run_pending()是保持schedule一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟linux中设置crontab定时任务是类似的。

所以,schedule有一定的局限性,所以只能用来执行一些小型的定时任务,它的局限性在哪呢?
1.需要定时运行的函数job不应当是死循环类型的,也就是说,这个线程应该有一个执行完毕的出口。一是因为线程万一僵死,会是非常棘手的问题;二是下一次定时任务还会开启一个新的线程,执行次数多了就会演变成灾难。
2.如果schedule的时间间隔设置得比job执行的时间短,一样会线程堆积形成灾难,也就是说,我job的执行时间是1个小时,但是我定时任务设置的是5分钟一次,那就会一直堆积线程。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值