Python asyncio 中 run_in_executor 与 to_thread 的选型与踩坑
在 Python 异步服务里处理阻塞调用时,asyncio 提供了两种把同步函数挪到线程池执行的手段:loop.run_in_executor 和 asyncio.to_thread。前者从 3.4 就存在,后者 3.9 才加入,封装了 run_in_executor 的默认线程池逻辑。很多项目里会混用两者,或者在 FastAPI、aiohttp 这类框架中随意调用,结果遇到线程池被占满、默认池大小只有 CPU 核数、取消任务时线程仍在后台跑、以及上下文变量不传递等问题。这篇文章从实际代码出发,说明两者在事件循环绑定、取消行为、contextvars 传递、默认执行器容量上的差异,并给出在 C...