skipped: maximum number of running instances reached (1)
Python 的 apscheduler 今天出现
skipped: maximum number of running instances reached (1)
问题产生的原因:
前一个任务未完成,
在只有一个线程的情况下,max_instances 默认值为 1
解决方法:
调整APScheduler使用的线程池大小来增加并发处理任务的能力
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.executors.pool import ThreadPoolExecutor from apscheduler.executors.pool import ProcessPoolExecutor from jobs.job import deal_jobs # 创建调度器 executor = { 'default': ThreadPoolExecutor(10), # 默认线程数 'processpool': ProcessPoolExecutor(3) # 默认进程 } job_defaults = { coalesce': False, 'max_instances': 3 } scheduler = BackgroundScheduler(executors=executor,job_defaults=job_defaults) scheduler = BackgroundScheduler(executors={'default': executor}) scheduler.add_job(deal_jobs, 'interval', seconds=20) # 启动调度器 scheduler.start()
说明:
coalesce 是否合并执行
由于某个原因导致某个任务积攒了N次没有执行。
coalesce=True
,下次恢复运行的时候,会只执行一次
coalesce=False
,不会合并,会N次全部执行
max_instances 最大实例数
同一个任务同一时间最多只能有N个实例在运行
合理设置任务的执行时间
如果任务执行时间过长,会出现等待任务完成,而无法处理其他任务
可以将执行时间长的任务分解,分解为多个子任务,并分配到多个调度器中,每个调度器只需处理一部分子任务,这样可以提高整体的任务并发性能