APScheduler 3.3.1仅执行有限数量定时任务问题求助
问题
在Python 2.7环境中使用APScheduler 3.3.1时,遇到调度器首次仅执行10个任务(实际添加了14个),第二轮及后续运行才触发剩余任务的问题。测试代码及运行输出如下:
测试代码
#!/usr/bin/env python # -*- coding: utf-8 -*- import datetime import time from apscheduler.schedulers.background import BackgroundScheduler def fetch_job(a): print a time.sleep(1) print a, ' awakened' scheduler = BackgroundScheduler() schedules = [ {'source': '1', 'interval': 10, 'job': fetch_job}, {'source': '2', 'interval': 10, 'job': fetch_job}, {'source': '3', 'interval': 10, 'job': fetch_job}, {'source': '4', 'interval': 10, 'job': fetch_job}, {'source': '5', 'interval': 10, 'job': fetch_job}, {'source': '6', 'interval': 10, 'job': fetch_job}, {'source': '7', 'interval': 10, 'job': fetch_job}, {'source': '8', 'interval': 10, 'job': fetch_job}, {'source': '9', 'interval': 10, 'job': fetch_job}, {'source': '10', 'interval': 10, 'priority': 3, 'job': fetch_job}, {'source': '11', 'interval': 10, 'job': fetch_job}, {'source': '12', 'interval': 10, 'job': fetch_job}, {'source': '13', 'interval': 10, 'job': fetch_job}, {'source': '14', 'interval': 10, 'job': fetch_job} ] for i, k in enumerate(schedules): scheduler.add_job(k['job'], 'interval', seconds=k['interval'], args=[k['source'],], next_run_time=datetime.datetime.now()) scheduler.start() while True: time.sleep(2)
运行输出
1 2 3 4 5 6 7 8 9 10 1 awakened No handlers could be found for logger "apscheduler.executors.default" 2 awakened 43 awakened65 awakened awakened awakened 7 awakened 8 awakened 9 awakened 10 awakened
解决方案
问题原因
APScheduler 3.x默认的default执行器基于线程池实现,默认最大线程数为10。当同时触发14个任务时,线程池只能并行处理10个任务,剩余4个会进入等待队列,直到已有线程执行完任务释放资源后,才会被调度执行。因此首次运行仅能看到10个任务启动,第二轮运行时线程已释放,剩余任务才能正常触发。
解决方法
1. 增大线程池容量
初始化调度器时,显式指定执行器的max_workers参数,将线程池大小调整为能容纳所有并发任务的数值:
scheduler = BackgroundScheduler(executors={ 'default': {'type': 'threadpool', 'max_workers': 14} })
根据实际任务数量调整max_workers的值,确保所有任务能同时执行。如果后续任务数量可能增加,可以设置更大的数值(如20)。
2. 可选:消除日志警告
输出中的No handlers could be found for logger "apscheduler.executors.default"警告,可通过添加基础日志配置消除:
import logging logging.basicConfig(level=logging.INFO)
内容的提问来源于stack exchange,提问作者A.F.N
相关产品推荐
相关产品推荐

