【APscheduler 】Execution of job “run_job (trigger: cron[minute=‘0-59‘], next run at: 2023-04-11 18:47

apscheduler 实例报错,next run at: 2023-04-11 18:47:00 CST)" skipped: maximum number of running instances reached (10)
如何解决?

这是因为APScheduler在默认情况下使用的是BlockingScheduler,即阻塞调度器,它会在单个线程中按照设定的规则执行定时任务。当线程忙于运行任务而没有空闲线程来处理新的任务时,就会出现上述错误提示。

解决这个问题的一种方法是使用BackgroundScheduler,即后台调度器,它会在后台启动一个或多个线程来运行任务,可以有效地避免上述问题。

另外,如果你需要同时运行较多的任务,可以考虑使用ThreadPoolExecutor或ProcessPoolExecutor来增加线程或进程池的大小,从而提高任务并发处理能力。

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.executors.pool import ThreadPoolExecutor

executors = {
    
    
    'default': ThreadPoolExecutor(20)
}
scheduler = BlockingScheduler(executors=executors)

以下是使用BackgroundScheduler的示例代码:

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

BackgroundScheduler 和 BlockingScheduler 是 APScheduler 中最常用的两种调度器。

不同之处
BackgroundScheduler:
后台调度器,会在后台启动一个或多个线程来运行任务,可以有效地避免因为任务阻塞而导致的卡顿和性能下降。注意:BackgroundScheduler 默认使用的是 ThreadPoolExecutor 线程池来执行任务,如果需要使用进程池,则需自己配置 ProcessPoolExecutor。
BlockingScheduler:
阻塞调度器,采用单线程的方式按照设定的规则执行定时任务,只有当当前任务执行完成后才会执行下一个任务。因此,如果某个任务运行时间较长或者发生了阻塞,将会影响整个应用程序的性能。
适用场景
BackgroundScheduler 适用于需要同时运行多个任务或者需要长时间运行任务的场景,例如爬虫、数据分析等;
BlockingScheduler 适用于任务量较小、需要保证任务按照顺序依次执行的场景,例如定时备份数据、生成报表等。
综上所述,选择不同类型的调度器应该根据具体应用场景来确定。

猜你喜欢

转载自blog.csdn.net/u013421629/article/details/130370256