You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:46:08