Python生成器的暂停恢复由yield与next()/send()协同实现,并非外部可抢占式控制;首次调用next()运行至首个yield即暂停,send()可传值并恢复执行,但首次须用next()或send(None)。
Python生成器本身不保存执行状态供外部手动暂停/恢复,它的“暂停恢复”是协程式自动行为——靠yield和调用方的next()或send()协同完成,不是像线程那样可随时冻结堆栈。理解这一点,才能正确设计可控的生成器逻辑。
每次执行到 yield 表达式时,生成器会保存当前帧(局部变量、执行位置等),返回值并暂停;下一次调用 __next__()(或 next())时,从 yield 后继续执行。
yield 语句执行**后**,不是之前next(g) 会运行到第一个 yield 并暂停,不会执行后续代码return 或函数自然退出),再调用 next() 会抛出 StopIteration
generator.send(value) 不仅恢复执行,还能把值传入生成器内部——作为上一次 yield 表达式的返回值。这可用于动态控制流程,比如等待外部指令再继续。
next(g) 或 g.send(None),不能直接 send(x)
x = yield y 表示:暂停并产出 y,恢复时把传入值赋给 x
如果需要显式控制(如 pause()、resume()、is_running),可包装原生生成器:
threading.Event 或简单布尔变量yield None 并循环等待next() 触发恢复(注意避免死锁)async/await + asyncio.Queue,适合复杂状态协调别把生成器当线程用——它没有独立栈、不能被抢占、无法从外部中断正在执行的计算段。
yield 前无法暂停sys.settrace 或调试器断点能“暂停”,但这是调试行为,不可用于生产级控制asyncio、concurrent.futures 或专用任务队列(如 Celery)