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

Azure Functions Premium调用Adobe Analytics getReportSuites方法报错

故障根因定位

抛出的cannot schedule new futures after shutdown错误为Python concurrent.futures Executor实例被关闭后,仍尝试向其提交新任务触发的标准报错,结合本地正常、Azure Functions Premium环境异常、近期突然失效的特征,根因为以下两点:

  1. Adobe Analytics Python SDK底层默认使用全局共享的Executor实例处理请求,Azure Functions Premium Python运行时会在函数调用间隙/闲时主动回收未绑定的后台线程资源,提前关闭了该全局Executor,调用getReportSuites时就会触发报错。
  2. 近期触发失效的原因通常为两类:一是Azure Functions Python运行时更新了资源回收规则,缩短了后台闲置线程的存活时间;二是Adobe Analytics SDK版本更新,调整为全局Executor复用逻辑,而非每个Analytics客户端实例单独持有独立Executor。
可行解决方案

方案1:调整调用时序(改造成本最低)

将getReportSuites调用紧挨着Analytics实例初始化逻辑,中间不要插入任何异步等待、耗时操作,避免Executor被判定为闲置提前回收,代码修改示例:

import logging
import api2

def get_vrs_list(cids):
    tkn = None
    try:
        # 初始化后立刻调用getReportSuites,中间不要加其他逻辑
        tkn = api2.Analytics(cids)
        vrsid = tkn.getReportSuites()
        return vrsid
    except Exception as ex:
        if not tkn:
            logging.error(f"初始化Analytics实例失败: {str(ex)}")
        else:
            logging.error(f"调用getReportSuites失败: {str(ex)}")
        return None

方案2:传入自定义Executor(最优方案)

大部分Adobe Analytics Python SDK支持初始化时传入自定义Executor参数,每个实例单独持有独立Executor,规避全局实例被回收的问题:

from concurrent.futures import ThreadPoolExecutor
# 初始化时传入独立线程池
tkn = api2.Analytics(cids, executor=ThreadPoolExecutor(max_workers=2))

调用完成后如果需要主动回收资源可以手动调用shutdown方法,不需要的话函数调用结束后会自动回收。

方案3:临时兼容方案

如果SDK版本过旧不支持自定义Executor,可在Azure Functions配置面板添加环境变量:
PYTHON_ENABLE_THREADPOOL_SHUTDOWN_ON_EXIT = 0
该配置会关闭运行时自动回收线程池的逻辑,无需修改代码即可临时恢复功能,可作为版本过渡方案使用。


内容的提问来源于stack exchange,提问作者MrPotatoServer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:02