核心思路是将Generator执行链改造为可感知、可拦截、可降级、可恢复的分层处理流:感知层前置校验输入与依赖;决策层通过safe_generate实现异常路由与重试;执行层支持断点续传与状态快照;链路层引入熔断与动态降级策略。

核心思路是把 Generator 执行链从“单线程强依赖”变成“可感知、可拦截、可降级、可恢复”的分层处理流。崩溃往往不是因为出错,而是因为错误没被及时捕获、没留退路、没状态锚点。
感知层:前置校验与输入过滤
Generator 的崩溃常始于非法输入或上下文缺失。不能等到 yield 时才暴露问题。
- 在调用 Generator 前,用轻量 Schema(如 Pydantic 模型)校验输入参数类型、必填字段、长度范围
- 对关键依赖(如外部 API client、数据库连接)做预检:检查是否已初始化、是否健康、是否超时阈值内
- 为每个 Generator 封装一层 wrapper,自动注入 context snapshot(如当前 step ID、用户 session hash),便于后续定位
决策层:带约束的 yield 控制与异常路由
Generator 本身不处理异常,但它的调用方必须承担决策责任——决定是重试、跳过、替换还是终止整个链。
- 避免裸写
for item in generator(): ...,改用封装好的执行器: -
def safe_generate(gen_func, *args, fallback=None, max_retries=2):
try:
yield from gen_func(*args)
except ValidationError as e:
logging.warning(f"Input validation failed: {e}")
if fallback: yield from fallback()
except Exception as e:
if max_retries > 0:
yield from safe_generate(gen_func, *args, fallback=fallback, max_retries=max_retries-1)
else:
raise - 对 yield 出的每项结果加轻量校验钩子(如非空、格式合规),不合规项走 fallback 路径而非中断链
执行层:断点续传 + 状态快照
Generator 是状态化的,一旦崩溃,传统 for 循环无法从中断处继续。必须显式保存执行位置。
- 用类封装 Generator,内部维护
self._checkpoint = {"step": 3, "last_yielded": {...}} - 每次成功 yield 后,异步写入内存缓存(如 Redis)或本地文件,内容含:当前迭代索引、输入参数哈希、输出摘要
- 支持从 checkpoint 恢复:
gen = MyGenerator.from_checkpoint(checkpoint_id),跳过已产出项,直接 resume 下一步 - 对长耗时子步骤(如调用 LLM 或远程搜索),单独包装为可重入函数,失败时只重试该步,不影响整条链
链路层:熔断与动态降级策略
当某个 Generator 频繁报错(比如依赖的第三方服务抖动),要防止它拖垮整个流水线。
- 为每个 Generator 注册独立熔断器(CircuitBreaker),统计 1 分钟内失败率;超阈值(如 60%)后自动切换至 stub 版本或缓存结果
- 定义降级优先级表:例如天气查询 Generator 失败 → 用本地缓存历史值;若缓存也过期 → 返回默认文案“暂无法获取实时天气”
- 支持运行时热更新降级配置,无需重启服务即可切回主逻辑

















