Python定时任务APScheduler原理及实例解析
定时任务:
1、线程睡眠函数sleep()——粗暴!一直占有CPU资源,导致后续操作无法执行
2、threading.Timer(10,task,()).start()#(间隔s,任务task,函参)
3、importsched
#初始化sched模块的scheduler类 scheduler=sched.scheduler(time.time,time.sleep) #增加调度任务enter(delay,priority,action,argument=(),kwargs={}) scheduler.enter(10,1,task) #运行任务 scheduler.run()
scheduler中的每个调度任务只会工作一次,不会无限循环被调用。如果想重复执行同一任务,需要重复添加调度任务即可。
- enter(delay,priority,action,argument=(),kwargs={})间隔执行任务。delay单位是秒。priority越小优先级越大。两个任务指定相同的延迟时间,优先级大的任务会向被执行。action即需要执行的函数,argument和kwargs分别是函数的位置和关键字参数。
- scheduler.enterabs(time,priority,action,argument=(),kwargs={})时间点执行任务。因此,time是绝对时间.其他参数用法与enter()中的参数用法是一致。
APScheduler——AdvancedPythonScheduler。
一个轻量级的Python定时任务调度框架。APScheduler支持三种调度任务:固定时间间隔,固定时间点(日期),Linux下Crontab命令。同时,它还支持异步执行、后台执行调度任务。
importdatetime importtime fromapscheduler.schedulers.backgroundimportBackgroundScheduler deftimedTask(): print(datetime.datetime.utcnow().strftime("%Y-%m-%d%H:%M:%S.%f")[:-3]) if__name__=='__main__': #1.创建后台执行的schedulers scheduler=BackgroundScheduler() #2.添加调度任务,调度方法为timedTask,触发器选择interval(间隔性),间隔时长为2秒 job=scheduler.add_job(timedTask,'interval',seconds=2) #3.启动调度任务 scheduler.start() whileTrue: print(time.time()) time.sleep(5)
基础组件
- schedulers(调度器)它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。
- BlockingScheduler:调度器在当前进程的主线程中运行,也就是会阻塞当前线程。
- BackgroundScheduler:调度器在后台线程中运行,不会阻塞当前线程。
- AsyncIOScheduler:结合asyncio模块(一个异步框架)一起使用。
- GeventScheduler:程序中使用gevent(高性能的Python并发框架)作为IO模型,和GeventExecutor配合使用。
- TornadoScheduler:程序中使用Tornado(一个web框架)的IO模型,用ioloop.add_timeout完成定时唤醒。
- TwistedScheduler:配合TwistedExecutor,用reactor.callLater完成定时唤醒。
- QtScheduler:你的应用是一个Qt应用,需使用QTimer完成定时唤醒。
- triggers(触发器)描述调度任务被触发的条件。不过触发器完全是无状态的。
- date时间点触发:scheduler.add_job(job_func,'date',run_date=datetime(2017,12,13,14,0,0),args=['text'])
- interval固定时间间隔触发:scheduler.add_job(job_func,'interval',minutes=2,start_date='2017-12-1314:00:01',end_date='2017-12-1314:00:10')
- cron特定时间周期性地触发:scheduler.add_job(job_func,'cron',month='1-3,7-9',day='0,tue',hour='0-3')
- jobstores(作业存储器)任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中,任务中的数据序列化后保存到持久化数据库,从数据库加载后又反序列化。
- 有两种添加方法,一是add_job(),二是scheduled_job()修饰器来修饰函数。区别是:第一种方法返回一个apscheduler.job.Job的实例,可用来改变或移除job。第二种方法只适用于应用运行期间不会改变的job。
- 移除job也有两种方法:remove_job()和job.remove()。
- remove_job()是根据job的id来移除,所以要在job创建时指定一个id。job.remove()则是对job执行remove方法即可。
- 获取job列表:通过scheduler.get_jobs()方法能够获取当前调度器中的所有job的列表。
- 修改job:用Job.modify()或modify_job()方法来修改job的属性。但注意job的id是无法被修改的。
- 关闭job:默认情况下调度器会等待所有正在运行的作业完成后,关闭所有的调度器和作业存储。如果你不想等待,可以将wait选项设置为False。
- 更新任务reschedule_job()
- executors(执行器)负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或进城池来进行。当作业完成时,执行器将会通知调度器。最常用的executor有两种:ProcessPoolExecutor和ThreadPoolExecutor
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。