Python APScheduler

 

import time, threading, sched, datetime
from threading import Timer 
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler


# bootstart + flask scheduler
def main():
    #timeTask()   
    #timerTask()
    #testSched()
    testAPScheduler() 
    
def timeTask():
    while True:
        task()
        time.sleep(5)

#Python 标准库 threading 中有个 Timer 类。它会新启动一个线程来执行定时任务(只执行一次), 它是非阻塞函式。
def timerTask():
    '''
            第一个参数: 延迟多长时间执行任务(单位: 秒)
            第二个参数: 要执行的任务, 即函数
            第三个参数: 调用函数的参数(tuple)
    '''
    Timer(5, task, ()).start()

# 使用标准库中sched模块。sched 是事件调度器,它通过 scheduler 类来调度事件,从而达到定时执行任务的效果。
# 还是在主线程里面跑
def testSched():
    # 初始化 sched 模块的 scheduler 类
    scheduler = sched.scheduler(time.time, time.sleep)
    # 增加调度任务
    # 该函数可以延迟一定时间执行任务。delay 表示延迟多长时间执行任务,单位是秒。priority为优先级,越小优先级越大。
    # 两个任务指定相同的延迟时间,优先级大的任务会向被执行。action 即需要执行的函数,argument 和 kwargs 分别是函数的位置和关键字参数。
    # enter(delay, priority, action, argument=(), kwargs={})
    scheduler.enter(5, 1, task)
    # 运行任务
    scheduler.run() 

# pip install APScheduler
# 上面三种办法能实现定时任务,但是都无法做到循环执行定时任务。因此,需要一个能够担当此重任的库。它就是APScheduler。
# 如果主线程退出了 那么该线程也会自动退出
def testAPScheduler():
    # APScheduler中有很多种不同类型的调度器,BlockingScheduler与BackgroundScheduler是其中最常用的两种调度器。
    # 区别主要在于BlockingScheduler会阻塞主线程的运行,而BackgroundScheduler不会阻塞。
    # 创建后台执行的 schedulers
    #scheduler = BlockingScheduler()
    scheduler = BackgroundScheduler()  
    # 添加调度任务
    # 调度方法为 timedTask,触发器选择 interval(间隔性),间隔时长为 2 秒
    #scheduler.add_job(task, 'interval', seconds = 5) #重复执行时,间隔时间必须大于job执行时间
    now = datetime.datetime.now()
    future = now + datetime.timedelta(seconds = 5)
    scheduler.add_job(task1, 'date', run_date=future, args=['text1'])
    scheduler.add_job(task1, 'date', run_date=future, args=['text2'])
    scheduler.add_job(task1, 'date', run_date=future, args=['text3'])
    # 启动调度任务
    scheduler.start() 

def task():
    curThread = threading.currentThread()
    print(curThread.name, curThread.ident)
    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) 
    time.sleep(20)
    
def task1(text):
    print("text:" + text)
    curThread = threading.currentThread()
    print(curThread.name, curThread.ident)
    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) 
    time.sleep(10)
    print(text, "------")
    
if __name__ == '__main__': 
    curThread = threading.currentThread()
    print(curThread.name, curThread.ident)
    main()
    
    time.sleep(20)
    print("---end----")

MainThread 13388
text:text2
ThreadPoolExecutor-0_0 9792
2019-02-01 20:09:47
text:text1
ThreadPoolExecutor-0_1 536
2019-02-01 20:09:47
text:text3
ThreadPoolExecutor-0_2 4392
2019-02-01 20:09:47
text2 ------
text1 ------
text3 ------
---end----

posted @ 2019-02-01 20:11  牧 天  阅读(774)  评论(0)    收藏  举报