Generator与定时器组合可将长任务拆分为可中断、可控的步骤,生成器定义步骤蓝图,定时器按节奏驱动执行,支持暂停/取消及状态反馈,并需对CPU密集型步骤做异步或多进程解耦。

用 Generator 和定时器组合,可以自然地把一个长任务拆成多个可中断、可控制的步骤,既避免阻塞主线程,又保持逻辑清晰、状态可控。
核心思路是:让生成器负责“产出步骤”,定时器负责“按节奏驱动步骤”。Generator 不直接执行,只定义每一步该做什么;定时器在指定间隔后拉取下一步并执行。
用生成器定义分步逻辑
生成器函数返回一个迭代器,每次 yield 一个待执行的操作(比如函数对象、参数元组或字典)。它不主动运行,只提供步骤蓝图。例如,模拟一个需 5 步完成的数据处理流程:
def data_pipeline():
yield {"step": "加载数据", "func": load_data}
yield {"step": "清洗数据", "func": clean_data}
yield {"step": "特征提取", "func": extract_features}
yield {"step": "模型预测", "func": predict}
yield {"step": "保存结果", "func": save_result}
这样写的好处是:步骤顺序明确、可复用、易调试,且不依赖外部状态。
用 threading.Timer 驱动单步执行
不用 while True + sleep(会阻塞),而是用非阻塞的 Timer 实现“每步延后触发”。每次执行完当前步,就启动下一个 Timer。关键点:
- 用 next() 拉取生成器的下一项,遇到 StopIteration 就停止
- 每次 Timer 触发后,执行对应操作,再递归调度下一步
- 支持暂停/取消:加个全局 flag 或用类封装状态更稳妥
示例片段:
gen = data_pipeline()
def run_step(interval=2.0):
try:
step = next(gen)
print(f"→ 执行:{step['step']}")
step["func"]() # 实际调用
threading.Timer(interval, run_step, [interval]).start()
except StopIteration:
print("✅ 全部步骤完成")
加入控制与状态反馈
纯自动执行不够灵活。实际中常需手动暂停、跳过、重试某步,或查看当前进度。推荐封装为类,把生成器、当前状态、控制信号都集中管理:
- 用 self._gen 存生成器实例
- 用 self._running 控制是否继续调度
- 提供 .pause() / .resume() / .next_step() 方法
- 每步执行后 emit 事件或更新 shared dict,供 UI 或日志消费
这样就能对接 Web 后端(如 Flask API)或桌面界面,实现可视化流程控制。
注意 GIL 与 IO/CPU 分离
如果某步是耗时计算(如图像处理),它会在单线程里卡住整个定时器链。这时应把该步交给 ProcessPoolExecutor 或 asyncio.to_thread,避免拖慢后续步骤。例如:
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as pool:
await asyncio.to_thread(pool.submit, heavy_computation, data)
Generator 只管“调度节奏”,真正耗时动作要异步/多进程解耦——这才是分步执行真正可落地的关键。

















