内容提要
PEP 789 提出了一个新的上下文管理器 sys.prevent_yields(),旨在解决 Python 中异步生成器的任务取消问题。该管理器在其上下文中禁止使用 yield,以避免错误的任务取消和异常处理。提案强调结构化并发的重要性,并建议在 asyncio 等库中实施,以确保任务的正确管理和异常的准确传递。
关键要点
-
PEP 789 提出了一个新的上下文管理器 sys.prevent_yields(),旨在解决 Python 中异步生成器的任务取消问题。
-
该管理器在其上下文中禁止使用 yield,以避免错误的任务取消和异常处理。
-
提案强调结构化并发的重要性,建议在 asyncio 等库中实施,以确保任务的正确管理和异常的准确传递。
-
使用 yield 暂停帧会导致错误的任务取消和异常处理,违反了结构化并发的设计原则。
-
提案中建议的 sys.prevent_yields() 将在 asyncio 和下游库中用于实现任务组、超时和取消。
-
提案还讨论了如何通过用户定义的上下文管理器安全地使用 yield,以及如何在实现中跟踪帧的状态。
延伸问答
PEP 789 的主要目的是什么?
PEP 789 旨在通过引入新的上下文管理器 sys.prevent_yields() 来解决 Python 中异步生成器的任务取消问题。
sys.prevent_yields() 是如何工作的?
sys.prevent_yields() 在其上下文中禁止使用 yield,试图 yield 时会引发 RuntimeError,从而防止错误的任务取消和异常处理。
为什么在异步生成器中使用 yield 会导致问题?
在异步生成器中使用 yield 会导致任务取消和异常处理错误,违反了结构化并发的设计原则。
PEP 789 如何促进结构化并发?
PEP 789 强调结构化并发的重要性,建议在 asyncio 等库中实施,以确保任务的正确管理和异常的准确传递。
如何安全地在用户定义的上下文管理器中使用 yield?
可以通过将生成器实现为上下文管理器来安全地使用 yield,这样可以确保异常被正确传递到预期的任务。
PEP 789 对现有代码的兼容性如何?
PEP 789 的引入是向后兼容的,但禁止在 asyncio.TaskGroup 和 asyncio.timeout 中使用 yield 可能会影响一些现有代码。