python 3.10 对 asyncio 的增强包括:timeouterror 改为继承 exception;新增 asyncio.to_thread() 简化阻塞调用;| 运算符与 typing.union 完全等价;解释器优化带来间接性能提升;match 中 await 合法但类型推导仍受限。

match 语句本身不直接影响异步逻辑,但 Python 3.10 对 asyncio 的增强是真实存在的——它不是大改 API,而是补上了几个长期被吐槽的细节缺陷。
asyncio.TimeoutError 现在继承自 Exception 而非 BaseException
以前写 try/except 捕获超时异常时,容易漏掉 TimeoutError,因为它的父类是 BaseException,和 KeyboardInterrupt、SystemExit 同级。Python 3.10 把它移到了 Exception 下,意味着:
-
except Exception:现在能正常捕获asyncio.TimeoutError - 不再需要单独写
except asyncio.TimeoutError:或except BaseException: - 旧代码若依赖“超时不被
Exception捕获”这一行为,会意外改变控制流
asyncio.to_thread() 是新增的正式 API(Python 3.10+)
这是真正影响日常开发的改进:不用再手写 loop.run_in_executor() 包装阻塞调用。它让 CPU-bound 或阻塞 IO 操作接入 async 更轻量。
- 替代方案:
await asyncio.to_thread(os.listdir, "/tmp")比手动创建ThreadPoolExecutor少 4–5 行样板 - 注意它只适用于线程安全的函数;对进程密集型任务,仍得用
asyncio.to_process()(该函数不存在,别信错觉) - 底层仍走
concurrent.futures.ThreadPoolExecutor,所以线程池大小、复用逻辑没变
没有 Union 类型的“新”变化,但 typing.Union 和 | 运算符行为更一致
Python 3.10 并未新增 Union 语义,但它把 | 提升为一等类型运算符(PEP 604),并确保 typing.Union[A, B] 和 A | B 在运行时和静态检查中完全等价:
-
isinstance(x, int | str)现在合法且高效(之前会报TypeError) -
get_type_hints()返回值里,A | B不再被转成Union[A, B]冗余形式 - 第三方类型检查器(如 mypy 0.930+、pyright)必须支持
|,否则match分支类型推导可能出错
性能提升主要来自解释器层,async 代码受益但不显著
所谓“异步性能提升”不是 asyncio 自身重写,而是 CPython 解释器优化带来的间接收益:
- 函数调用开销降低约 10%,对高频
await(比如每毫秒 await 一次协程)有可测差异 -
async for循环的迭代器协议调用路径变短,但实际瓶颈通常在 IO 层,不是解释器 - 别指望
asyncio.sleep(0.1)变快——它本质是事件循环调度,不受字节码优化影响
match 分支里做 await 是合法的,但类型检查器目前无法推导分支内 await 后的精确返回类型,尤其当模式涉及嵌套结构 + Union 时。这不是 bug,是当前工具链的能力边界。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











