安装pipinstallapscheduler简单例子fromapscheduler.schedulers.backgroundimportBackgroundSchedulerfromapscheduler.executors.poolimportThreadPoolExecutor,ProcessPoolExecutorfromapscheduler.jobstores.sqlalchemyimportSQLAlchemyJobStorefromapscheduler.eventsimportEVENT_JOB_EXECUTED,EVENT_JOB_ERRORimportloggingimportdatetime#任务执行函数defjob_func(job_id):print('job%sisrunedat%s'%(job_id,datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')))#eventlistenerdefjob_exception_listener(event):ifevent.exception:#todo:异常处理,告警等print('Thejobcrashed:(')else:print('Thejobworked:)')#Logging.basicConfig()logging.getLogger('apscheduler').setLevel(logging.DEBUG)#定义后台任务非阻塞调度器scheduler=BackgroundScheduler()#在内存中添加一个任务#Trigger:trigger='interval'seconds=10每10s触发执行#Executor:executor='default'线程执行#Taskmemory:jobstore='default'默认内存存储#最大并发数:max_instancescheduler.add_job(job_func,trigger='interval',args=[1],id='1',name='atestjob',max_instances=10,jobstore='default',executor='default',seconds=10)#设置任务监控施eduler.add_listener(job_exception_listener,EVENT_JOB_EXECUTED|EVENT_JOB_ERROR)#启动调度器scheduler.start()runningstatus:job1isrunedat2020-03-2120:00:38Thejobworked:)job1isrunedat2020-03-2120:00:48Thejob2work1runed-05:8trigger)Thejob00work触发器确定何时执行任务。APSchedulertrigger='interval'支持3种触发器:按照固定时间段执行,支持周、日、时、分、秒,也可以指定时间范围sched.add_job(job_function,'interval',hours=2,start_date='2010-10-1009:30:00',end_date='2014-06-1511:00:00')trigger='date':固定时间,执行一次sched.add_job(my_job,'date',run_date=datetime(2009,11,6,16,30,5),args=['text'])trigger='cron':支持crontab模式,执行任务参数:分/时/日/月/周粒度,也可以指定时间范围year(int|str)–4-digityearmonth(int|str)–month(1-12)day(int|str)–dayofthe(1-31)week(int|str)–ISOweek(1-53)day_of_week(int|str)–numberornameofweekday(0-6ormon,tue,wed,thu,fri,sat,sun)hour(int|str)–hour(0-23)minute(int|str)–分钟(0-59)秒(int|str)–秒(0-59)start_date(datetime|str)–earliestpossibledate/timetotriggeron(inclusive)end_date(datetime|str)–latestpossibledate/timetotriggeron(inclusive)示例#周一到周五,5:30执行任务job_function,直到2014-05-3000:00:00sched。add_job(job_function,'cron',day_of_week='mon-fri',hour=5,minute=30,end_date='2014-05-30')#按照crontab格式执行,格式为:分小时日月week,*表示所有#May到August从1号到15号,0:00执行任务任务;APScheduler支持4种不同的executor,常用的有pool(线程/进程)和gevent(io多路复用,支持高并发),默认是pool中的线程池,不同的executor可以在scheduler配置中配置(见Scheduler)apscheduler.executors.asyncio:同步io,阻塞apscheduler.executors.gevent:io多路复用,非阻塞apscheduler.executors.pool:线程ThreadPoolExecutor和进程ProcessPoolExecutorapscheduler.executors.twisted:基于事件的任务内存任务内存决定任务如何执行被保存。默认保存在内存中(MemoryJobStore),重启后就没有了。APScheduler支持的任务存储是:apscheduler.jobstores.memory:内存apscheduler.jobstores.mongodb:存储在mongodb中apscheduler.jobstores.redis:存储在redis中apscheduler.jobstores.rethinkdb:存储在rethinkdb中apscheduler.jobstores.sqlalchemy:支持sqlalchemymysql、sqlite等数据库。apscheduler.jobstores.zookeeper:zookeeper的不同任务存储,可以在scheduler的配置中配置(见scheduler)。调度器APScheduler支持的调度器方法有以下几种,比较常用的有BlockingScheduler和BackgroundSchedulerBlockingScheduler:适用于当调度器是进程中唯一运行的进程时,调用start函数会阻塞当前线程,不能立即返回.BackgroundScheduler:适用于应用后台运行的调度器,调用start后主线程不会阻塞。AsyncIOScheduler:适用于使用asyncio模块的应用程序。GeventScheduler:用于使用gevent模块的应用程序。TwistedScheduler:用于构建Twisted应用程序。QtScheduler:用于使用Qt构建应用程序。从前面的例子我们可以看出,调度器可以操作任务(并为任务指定触发器、任务内存和执行器)和监控任务。scheduler.add_job(job_func,trigger='interval',args=[1],id='1',name='atestjob',max_instances=10,jobstore='default',executor='default',seconds=10)我们仔细看一下各个部分的scheduler配置:在add_job中我们看到jobstore和executor都是默认的,APScheduler在定义scheduler的时候可以指定不同的任务存储和executor,还有初始参数frompytzimportutcfromapscheduler.schedulers.backgroundimportBackgroundSchedulerfromapscheduler.jobstores.mongodbimportMongoDBJobStorefromapscheduler.jobstores.sqlalchemyimportSQLAlchemyJobStorefromapscheduler.executors.poolimportThreadPoolExecutor,ProcessPoolExecutor#通过dictjobstores={'mongo':MongoDBJobAlmyStore(),'default'..cutorite={}'default':ThreadPoolExecutor(20),'processpool':ProcessPoolExecutor(5)}job_defaults={'coalesce':False,'max_instances':3}#Defineschedulerscheduler=BackgroundScheduler(jobstoresjobstores=jobstores,executorsexecutors=executors,job_defaultsjob_defaults=job_defaults,timezone=utc)defjob_func(job_id):print('job%sisrunedat%s'%(job_id,datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')))#添加任务scheduler.add_job(job_func,trigger='interval',args=[1],id='1',name='atestjob',jobstore='default',executor='processpool',seconds=10)#启动调度器scheduler.start()运行任务:调度程序可以添加、删除、暂停、恢复和修改任务。需要注意的是,这里的操作只对未执行的任务起作用,已经执行和正在执行的任务不受这些操作的影响。add_jobscheduler.add_job(job_func,trigger='interval',args=[1],id='1',name='atestjob',max_instances=10,jobstore='default',executor='default',秒=10)remove_job:通过任务的唯一id,删除时也会删除对应任务内存中的记录scheduler.add_job(myfunc,'interval',minutes=2,id='my_job_id')scheduler.remove_job('my_job_id')暂停和恢复作业:暂停并重新启动任务scheduler.add_job(myfunc,'interval',minutes=2,id='my_job_id')scheduler.pause_job('my_job_id')scheduler.resume_job('my_job_id'):修改任务Configurationjob=scheduler.add_job(myfunc,'interval',minutes=2,id='my_job_id',max_instances=10)#修改任务的属性job.modify(max_instances=6,name='Alternatename')#修改任务触发scheduler.reschedule_job('my_job_id',trigger='cron',minute='*/5')监控任务事件类型,比较常用的类型有:EVENT_JOB_ERROR:表示在执行过程中发生异常执行nofthetaskTriggerEVENT_JOB_EXECUTED:taskexecutionEVENT_JOB_MAX_INSTANCESonsuccess:scheduler.add_listener(job_exception_listener,EVENT_JOB_EXECUTED|EVENT_JOB_ERROR)当调度器上执行的任务超过配置参数时
