题记与说明
课题:Python asyncio 与 Node.js 事件循环(调度、阻塞、取消、超时与资源清理)
报告类型:横纵分析最终报告(纵轴发展脉络 + 横轴横向对比 + 交叉洞察)
撰写日期:2026-11-03
综合来源说明:本报告由以下两份章节稿去重、消歧后合成,本会话未重复执行网络核验,事实陈述与来源链接均继承自两稿:
- 纵轴章节:D:/CodexData/nightshift/output/reports/parts/2026-11-03-asyncio-nodejs-eventloop-vertical.md
- 横轴章节:D:/CodexData/nightshift/output/reports/parts/2026-11-03-asyncio-vs-nodejs-eventloop-horizontal.md
两份章节稿均基于其撰写会话中的网络检索与网页抓取(PEP 文档、Python/Node 官方 What's New、GitHub issue、LWN、InfoWorld、PyPI、TC39 提案等一手或准一手来源),关键事实附 URL;横轴章节稿称其中 Python 3.14/3.15 What's New 与 Trio PyPI 页面为当次直接抓取验证,Kotlin/Go/Rust 等跨语言语义细节为"既有知识"未逐一检索,本报告沿用其标注。两章原有三处口径不一致(TC39 显式资源管理的落地状态、uvloop 性能数字口径、Node 24 的时间线),已在正文逐一消歧,详见文末"两章口径消歧说明"。
修订说明(最终稿):本稿按独立审读意见修订初稿,未受质疑内容原样保留:①取消语义横轴排序改为"Trio ≈ asyncio > Node"并注明唯一残留差距,与"金标准是 Trio"口径统一;②修正 Trio→标准库的年份算术(五年,以 2017 年发布计);③修正 AsyncLocalStorage 与 contextvars 的时间线表述;④TL;DR 与洞察二的"趋同"限定为原语形态趋同,明写组级结构化并发仍是 Python 独有;⑤全部性能结论统一加"无现行权威基准可证"限定语;⑥四处关键事实补源(本最终稿会话经网络检索核验并附链接:Node 2026-01 安全公告、Azure Functions uvloop 官方博客、nest_asyncio 失效、gevent #2127);⑦首次出现处写全 PEP 703/779 分工、删去生造词"Trio 语系"、为 Node 侧补具体阻塞定位 API(perf_hooks);⑧新增"开放问题与下一步"小节,其中 PEP 789 破坏面按 PEP 原文(本会话抓取)、Node perf_hooks 与 Effection 均经当次抓取/检索核验。
TL;DR
asyncio 与 Node.js 事件循环是同一范式——协作式单线程循环——的两个成熟实现,真对手是 Go 这类"阻塞无害"模型。纵轴:2009/2014 年先后诞生,2015 年前后以 await 消灭回调;2022 年起 Python 吸收 Trio 的结构化并发(TaskGroup、asyncio.timeout),Node 则经 Web 标准(AbortSignal、TC39 ERM 的 using)补齐取消/清理原语但无组级结构化并发——原语形态趋同,语义上限仍分档。横轴:取消与超时语义 asyncio 领先(TaskGroup 与 asyncio.timeout 作用域化保证);Node 靠 AbortSignal 协作式取消,ES2026 的 using 才补上清理语法。性能:按已退役基准(TechEmpower,2025 年停更)的历史趋势与 uvloop 自述口径推断,Node 略占优、uvloop 可抹平大半差距——无现行权威基准可证,不应作为当前事实引用。建议:Python 资产密集选 asyncio;全栈 IO 网关选 Node;接受同步思维选 Go。
纵轴:发展脉络
阶段〇:前史(1999–2009)——事件循环为什么是必需品
一切要从 C10K 说起。1999 年 Dan Kegel 提出 C10K 问题(https://en.wikipedia.org/wiki/C10k_problem ):当并发连接数到达一万,"每连接一线程"的经典模型在内存与调度开销上双双崩塌。业界被迫认真对待一条新路——单线程事件循环 + 异步 I/O。
Python 一侧此时已经历了两代探索:Twisted(Glyph Lefkowitz 主导,约 2001–2002 年)成为事实标准,基于回调风格;PEP 342《Coroutines via Enhanced Generators》(2005 年,Guido van Rossum 与 Phillip J. Eby)给生成器加上 send(),为"用生成器模拟协程"铺平了语法道路;gevent/eventlet(约 2008 年,基于 greenlet)则走 monkey-patch 路线,用"同步写法、异步执行"与 Twisted 的显式异步形成两条对立路线。JavaScript 一侧,浏览器天生就是一个事件循环(单线程 + 消息队列),2008 年 V8 引擎开源,为"把这套模型搬到服务器"提供了高性能底座。
这一阶段的关键词是:回调地狱、手动调度、没有统一的事件循环抽象。两个语言各自积累了足够的痛感,只等一个统一的答案。
阶段一:双线诞生(2009–2014)——一个搬循环,一个造标准
Node.js:跑在服务器上的浏览器循环。 2009-02-16 Ryan Dahl 提交 Node.js 首个 commit,2009-11-08 在首届 European JSConf 演示,全场起立(Node.js Wikipedia、RisingStack 时间线)。早期 Node 基于 libev(仅 Unix);为支持 Windows,Joyent 的 Ben Noordhuis、Bert Belder 等人在 2010–2011 年开发了 libuv,用 IOCP 抽象掉平台差异,Node 0.6(2011-11)起全面取代 libev。libuv 后来独立成项目,成为 Node 事件循环的底座。Node 的核心设计取舍在诞生之初就已定型:单线程 JS 执行 + 平台级事件循环 + 线程池(libuv threadpool,默认 4 线程,供 fs、dns.lookup、crypto 等阻塞调用使用,UV_THREADPOOL_SIZE 可调)——"阻塞"问题在 Node 里被外包给线程池,而不是回避。
Python:从 PEP 3153 被拒到 Tulip。 2011 年 Glyph 的 PEP 3153 因社区难以达成一致被搁置;2011 年底 Guido van Rossum 亲自重写提案为 PEP 3156《Asynchronous IO Support Rebooted: the "asyncio" Module》(https://peps.python.org/pep-3156 ),参考实现代号 Tulip。2013-10 CPython issue #63461 追踪将其并入标准库(https://github.com/python/cpython/issues/63461 ),LWN 报道了 Guido 在 PyCon 2013 上的演讲(https://lwn.net/Articles/544522 )。2014-03 Python 3.4 正式内置 asyncio,David Beazley 在 USENIX ;login 撰文《Python Gets an Event Loop (Again)》(https://www.usenix.org/publications/login/june14/beazley );语法上依赖 PEP 380 的 yield from(Python 3.3,2012)。
这一阶段的共同哲学:单线程协作式调度,把并发交还事件循环。Guido 的个人背书终结了 Python 异步框架的碎片化;Node 用"浏览器模型搬到服务器"的简单性迅速赢得 Web 开发者。
阶段二:语法收敛与性能竞赛(2014–2017)——双方都想消灭回调
- 2015-09:PEP 492 落地 Python 3.5,
async/await成为原生语法(此前靠@asyncio.coroutine+yield from);2016-12 Python 3.6 经 PEP 525/530 引入异步生成器与异步推导式。 - 实验分支并行展开:2015 年 David Beazley 发布 Curio,2017 年 Nathaniel J. Smith 发布 Trio,提出取消作用域与结构化并发——后者在数年后深刻反哺了标准库(见阶段四)。
- 2016-04:Yury Selivanov(MagicStack)发布 uvloop,用 Cython 把 asyncio 事件循环架在 libuv 之上(https://github.com/MagicStack/uvloop )——一个标志性叙事:Python 反过来采用了 Node 的底层库 libuv。
- Node 一侧经历分叉动荡:2014-12 因对 Joyent 治理不满,核心贡献者分叉出 io.js(InfoWorld);2015-05 io.js 技术委员会投票加入新成立的 Node.js Foundation,合并后的 Node 4.0(2015-09) 统一代码库与开放治理(InfoQ)。
- 2017-02:Node 7.6 随 V8 5.5 默认启用
async/await,Node 开发者摆脱 Promise 链。
驱动因素:ES6 与 Python 3.x 都想用语法糖消灭回调;性能竞赛(uvloop、V8 迭代)证明单线程事件循环并非"慢"的代名词。
阶段三:工程化——阻塞、上下文与错误语义(2017–2020)——把实验室 API 变成可运维设施
大规模生产部署把"能跑"变成"可运维",两条线不约而同补工程课:
- Python:3.7(2018-06)
asyncio.run()成为标准入口,终结手动创建 event loop 的时代;PEP 567 引入contextvars解决异步任务间上下文传播;3.9(2020-10)补上asyncio.to_thread()给阻塞调用明确出路;3.10(2021-10)起从大量 asyncio API 移除loop参数、收紧get_event_loop(),强制走向隐式循环管理。错误纪律同步收紧:任务异常"never retrieved"告警、loop.shutdown_asyncgens(3.6 起)清理链路——单线程协作式世界里,错误和清理不能静默丢失。 - Node:Node 8(2017-05)引入实验性
async_hooks;AsyncLocalStorage(13.10 实验化、16.4 稳定)后来成为 Node 的"contextvars 等价物"。Node 11(2018-10)调整定时器语义对齐浏览器;Node 12(2019-04)worker_threads稳定,CPU 阻塞有了官方出口。2020-10 Node 15 是一次语义地震:未处理的 Promise 拒绝从警告改为默认崩溃(提案:https://github.com/nodejs/node/issues/20392 );同年AbortController全局可用(15.4 稳定)、timers/promises落地——Node 开始为取消与超时提供一等公民原语。 - 事件循环内部结构在本阶段被文档化、被公认:官方文档把 libuv 循环拆成 timers、pending callbacks、poll、check、close 五个阶段,
process.nextTick与 Promise 微任务穿插在阶段切换之间执行(官方讲解:https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick )——这套模型成为面试与排障的公共知识,也是"为什么一个同步循环饿死整个进程"的解释框架。
驱动因素:微服务化让请求追踪(contextvars/ALS)与故障即崩溃(fail-fast)成为刚需。
阶段四:结构化并发范式(2021–2024)——Trio 的理念反向输出
理念源头是 Trio 2018 年的文章《Notes on structured concurrency, or: go statement considered harmful》:并发单元应该有作用域,任务随作用域退出而自动清理、取消能可靠传播。
- Python 3.11(2022-10)是 asyncio 史上最重要的一次升级:PEP 654
ExceptionGroup+except*解决"多个子任务同时失败"的表达问题;asyncio.TaskGroup实现一败全撤,gather() 时代的"孤儿任务"有了标准答案;asyncio.timeout()/timeout_at()上下文管理器取代各处自造的wait_for包装(官方文档:https://docs.python.org/3/library/asyncio-task.html ;讨论:https://discuss.python.org/t/next-steps-after-pep-654-exceptiongroups-taskgroup-etc/12912 );Task.cancelling()/uncancel()让取消计数可见。 - 3.12(2023-10) 引入
asyncio.eager_task_factory(eager task 立即求值,减少调度开销)。 - Node 同步推进取消原语标准化:
AbortSignal.timeout()于 17.3(2021-12)加入(https://nodejs.org/api/globals.html );Node 18(2022-04)内置全局fetch(undici 实现,原生接受 signal);AbortSignal.any()(20.3,2023-06)支持信号组合。Web 标准的 AbortController 成为 Node 取消模型的骨架——与 Python 完全不同的取消哲学:Python 靠异常注入任务栈,Node 靠信号对象 + 各 API 自行监听。 - 阻塞维度上,libuv 线程池与 worker_threads 的分工稳定;Python 始终靠
run_in_executor/to_thread对接线程/进程池,GIL 是 Python 独有的额外枷锁。社区还出现 anyio 这类桥接库,让同一份代码同时跑在 asyncio 与 Trio 之上,FastAPI/Starlette 借道 anyio 吸收结构化并发收益——理念从 Trio 流向 asyncio 的路径不止标准库一条。 - Node 22(2024-04) 继续补齐调度周边(
node --watch转正、require(ESM) 实验),事件循环本体保持稳定——Node 进入"循环架构冻结、周边语义渐进"的成熟期。
阶段五:当下(2024–2026)——清理语义补全与并发终局
- Python 3.13(2024-10):
asyncio.Queue.shutdown()+QueueShutDown落地(https://docs.python.org/3/whatsnew/3.13.html ),"优雅关闭生产者-消费者管线"首次有了标准原语。 - PEP 789《Preventing task-cancellation bugs by limiting yield in async generators》(Zac Hatfield-Dodds 与 Nathaniel J. Smith)试图禁止在
TaskGroup/asyncio.timeout作用域内 yield,堵住"取消异常投递到错误任务"这类 2024 年才被系统化认识的缺陷;截至 2026-11-03 核验仍为 Draft(https://peps.python.org/pep-0789/ )——取消正确性仍是活跃战线。 - Python 3.14(2025-10):自由线程(no-GIL)获得官方支持状态——PEP 703 为去 GIL 实现提案(https://peps.python.org/pep-0703/ ),PEP 779 为官方支持状态提案,单线程开销约 5–10%(https://docs.python.org/3/whatsnew/3.14.html ),为"asyncio + 真并行"打开想象空间(具体受益路径见"开放问题与下一步");asyncio 内部重构导致
nest_asyncio等依赖 monkey-patch 内部实现的库失效(nest-asyncio 项目已停止维护并归档:https://github.com/jupyter/nbclassic/issues/328 ;其在 Python 3.14 下的构建失败实例:https://github.com/NixOS/nixpkgs/issues/474439 );同版新增任务内省 CLI。3.15(2026-10) 新增TaskGroup.cancel()显式提前撤组,Tachyon 采样剖析器支持--async-aware(https://docs.python.org/3/whatsnew/3.15.html )。 - Node 24 "Krypton"(2025-05 发布、2025-10-28 进入 LTS):通过 TC39 Explicit Resource Management 提案带来
using/await using、Symbol.dispose/Symbol.asyncDispose、DisposableStack(提案:https://tc39.es/proposal-explicit-resource-management ;发布综述:https://medium.com/@Brilworks/whats-new-in-node-js-24-67e6ead19394 )——JS 终于有了确定性的异步资源清理语法。随后 Node 25(2025-10)、Node 26 "Lithium"(2026-10-28 起成为 Active LTS,Node 24 转 maintenance) 按半年节奏推进;Node 26 默认启用 Temporal API、26.1 引入实验性node:ffi(版本与 LTS 时间线:https://nodejs.org/en/about/previous-releases )。 - 生态侧翼:Ryan Dahl 2018 年《10 Things I Regret About Node.js》催生 Deno,Bun(2022,Zig + JavaScriptCore)以更快的启动与 IO 加入竞争——三者共享"单线程事件循环 + AbortSignal 取消"的心智模型,反向印证 Node 范式的胜利。
五维演进轨迹(纵轴小结)
| 维度 | Python asyncio 演进 | Node.js 演进 |
|---|---|---|
| 调度 | 3.4 事件循环(2014) → 3.11 TaskGroup(2022) → 3.12 eager tasks(2023) | libev→libuv(2011) → Node 11 定时器对齐浏览器(2018) → 微任务/宏任务分层稳定 |
| 阻塞 | to_thread(3.9)/executor 池;GIL 直到 3.14 才由自由线程破局 | libuv threadpool(默认 4 线程) + worker_threads(12 稳定, 2019) |
| 取消 | CancelledError 协作式传播 → cancelling()(3.11) → PEP 789(仍 Draft) | AbortController(15.4) → AbortSignal.any(20.3),信号对象模型 |
| 超时 | wait_for → asyncio.timeout(3.11, 2022) | setTimeout 手工 → AbortSignal.timeout(17.3, 2021-12) |
| 清理 | async with / async generators(3.6) → Queue.shutdown(3.13, 2024) | 手写 finally → using/await using(Node 24, 2025) |
贯穿性的驱动因素有五:① C10K 与移动时代的高并发需求;② 语法层消灭回调(await);③ 生产事故倒逼 fail-fast 与可观测性;④ Trio/结构化并发对两家标准的反向输出;⑤ Web 标准化(AbortController、fetch、TC39 ERM)成为 Node 的设计引力,而 Python 则从竞品(libuv)与社区项目(Trio)处吸收养分。
横轴:横向对比(2026-11-03 截面)
竞品地图:谁在和这个课题竞争
| 层次 | 成员 | 与课题的关系 |
|---|---|---|
| L1 同语言同类(Python) | Trio、AnyIO、Twisted、Tornado、gevent、curio、uvloop | asyncio 的内部竞品/语义来源/历史包袱 |
| L2 同范式异运行时(JS/TS) | Node.js(libuv)、Deno(V8+Tokio)、Bun(JSC+Zig 自研循环) | 事件循环实现的三个分支,共享 Web 标准 API(AbortSignal 等) |
| L3 跨语言范式竞品 | Go(goroutine/netpoller)、Java 虚拟线程(JEP 444/505)、Kotlin 协程、Rust tokio、Erlang/BEAM | 用不同范式解决同一组问题:高并发 IO 的调度/取消/超时/清理 |
主对比表:asyncio vs Node.js(九维度)
| 维度 | Python asyncio(CPython 3.15,2026-10 发布) | Node.js 事件循环(Node 26 "Lithium",2026-10-28 起 Active LTS) |
|---|---|---|
| 调度机制 | 单线程循环 + call_soon/call_later(最小堆定时器);无回调阶段划分;3.12 起 eager task factory 减少启动开销 | libuv 循环有明确阶段(timers → pending → poll → check → close);process.nextTick 优先级最高;每阶段间清空 V8 微任务队列 |
| 阻塞治理 | 阻塞调用冻结整个 loop;逃生舱 run_in_executor/to_thread;GIL 限制 CPU 并行,但 3.14 自由线程已官方支持(PEP 779,单线程开销约 5–10%) | 阻塞冻结一切;逃生舱 worker_threads / child_process / libuv 线程池(默认 4 线程,UV_THREADPOOL_SIZE 可调;dns.lookup 与文件 FS 共用此池) |
| 取消 | Task.cancel() 注入 CancelledError;shield() 保护;TaskGroup(3.11)结构化取消,聚合为 ExceptionGroup;3.15 新增 TaskGroup.cancel() | 无原生任务取消;AbortController/AbortSignal 协作式取消(Web 标准);AbortSignal.timeout(ms)、AbortSignal.any() 组合信号;取消不注入异常,API 各自决定如何响应 |
| 超时 | asyncio.timeout() 上下文管理器(3.11+)可包裹任意 await 区间(作用域化);老 wait_for 属上一代方案 | 超时绑定到具体操作:AbortSignal.timeout(ms)、undici fetch 超时、timers/promises;无统一"超时作用域",组合需 AbortSignal.any() 手动拼装 |
| 资源清理 | async with/AsyncExitStack 语法级保证 __aexit__;TaskGroup 出口保证所有子任务终结;shutdown_asyncgens 收尾 | 长期依赖 try/finally;TC39 显式资源管理(using/await using、DisposableStack、SuppressedError)已列入 ES2026,Node 24+ 已落地;AsyncLocalStorage 负责上下文传播 |
| 可观测性 | 3.14 新增 asyncio 检查 CLI(python -m asyncio ps/pstree)与 capture_call_graph;3.15 Tachyon 剖析器 --async-aware | async_hooks/AsyncLocalStorage 成熟;--inspect 与诊断报告;2026-01-13 安全发布曾缓解 async_hooks 的 DoS 漏洞(官方公告:https://nodejs.org/en/blog/vulnerability/january-2026-dos-mitigation-async-hooks ) |
| 性能 | 默认循环中等;uvloop(libuv 实现)自述较默认循环快 2–4 倍;纯 Python 回调受解释器速度拖累 | V8 JIT 使 CPU 型回调更快;libuv 成熟稳定;IO 密集基准历史上占优,但 TechEmpower 已停更(见下文) |
| 生态 | 标准库自带;FastAPI/Starlette/httpx/aiohttp、SQLAlchemy 2.0 async、Django 渐进式 async;AnyIO 作跨后端底座 | npm 全球最大包生态;内置 fetch(undici)、AbortSignal 与浏览器/Deno/Bun 同构;Web 标准 API 天然跨端 |
| 成熟度 | 2014 年(3.4,PEP 3156)入标准库;随 CPython 年度迭代;单进程单循环默认 | 2009 年发布;libuv 由 Node 项目维护;Node 24→26 按半年节奏,循环架构长期冻结 |
关键来源:Python 3.14/3.15 What's New(https://docs.python.org/3/whatsnew/3.14.html 、https://docs.python.org/3/whatsnew/3.15.html ,横轴章节当次直接抓取);Node 发布时间线(https://nodejs.org/en/about/previous-releases );libuv 线程池(https://docs.libuv.org/en/v1.x/threadpool.html )。
调度:扁平队列 vs 阶段化循环
两者本质都是"协作式单线程 + 就绪队列 + IO 多路复用(epoll/kqueue/IOCP)",但循环内部结构不同。asyncio 的循环是扁平的:call_soon 把回调放进 FIFO 就绪队列,call_later/call_at 用最小堆管理定时器,没有阶段划分;语义简单,但调试时要自己理解"谁排在谁后面"。libuv 的循环有明确的阶段序列(timers → pending callbacks → poll → check → close callbacks),process.nextTick 拥有凌驾一切的优先级,V8 微任务在每个阶段之间被清空——这造就了 Node 独有的"nextTick 饥饿"陷阱。
值得记录的结构性事实:libuv 已成为跨语言资产。Python 侧最快的第三方循环 uvloop 就是 libuv 的 Python 绑定;而 JS 侧的两个新运行时反而抛弃了 libuv:Deno 用 Rust 的 Tokio 驱动事件循环(https://deno.com/blog/roll-your-own-javascript-runtime ),Bun 用 Zig 自研循环集成 JavaScriptCore(社区拆解讨论:https://news.ycombinator.com/item?id=31993429 ,未找到 Bun 官方架构文档等价表述,置信度中等)。在"事件循环引擎"这一层,libuv 的真实竞争者不是 asyncio,而是 Tokio 和 Bun 的 Zig 实现。
阻塞治理:一样的死穴,不一样的逃生舱
两个模型共同的软肋:任何一个阻塞调用都会冻结整条循环,没有抢占。差异在逃生舱形态:
- asyncio:
loop.run_in_executor()/asyncio.to_thread()把阻塞工作推给线程池,CPU 型任务需进程池——但这个前提在松动:3.14 中自由线程构建(PEP 703/779)从实验转为官方支持。3.14 的python -m asyncio ps/pstree内省 CLI 能直接看到"哪个任务卡在哪个 await 上",定位阻塞从猜变成看。 - Node.js:
worker_threads(真并行)、child_process、libuv 自带线程池。经典坑:libuv 线程池默认只有 4 个线程,dns.lookup和文件 IO 共用此池——慢 DNS 可以拖垮整个服务的文件读写。asyncio 侧对应的坑则是"loop 里混进了一个同步阻塞调用",3.14 的 pstree 正是为此而生。
与 L3 范式竞品的本质差异:Go 的 netpoller 和 Java 虚拟线程(JEP 444,Java 21 定稿,https://openjdk.org/jeps/444 )把"阻塞"变成无害操作——写同步代码,运行时自动挂起/恢复。asyncio 与 Node 都要求开发者主动识别阻塞点,这是它们相比 L3 的根本性人力成本。
取消:本课题差异最大的维度
asyncio 的取消是"推式异常注入":Task.cancel() 在任务的下个 await 点抛出 CancelledError,任务必须确认(或用 shield() 拒绝);TaskGroup(3.11)实现结构化取消——组内任一任务失败,其余全部取消,父协程拿到聚合的 ExceptionGroup。3.15 补上最后一块拼图:TaskGroup.cancel() 允许"目标已达成、提前撤组",官方明说此前需要反直觉的样板代码。语义金标准仍是 Trio 的 cancel scope,AnyIO 把这套语义同时带给 Trio 和 asyncio 两个后端(https://anyio.readthedocs.io )。
Node.js 的取消是"拉式协作信号":没有能注入异常的原生机制。AbortController 发出 signal,fetch/定时器/流各自决定是否以及如何响应(MDN:https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal )。AbortSignal.timeout(ms)(Node 17.3+)生成定时取消信号,AbortSignal.any()(Node 20.3+)组合信号(实战教程:https://blog.appsignal.com/2025/02/12/managing-asynchronous-operations-in-nodejs-with-abortcontroller.html )。三个结构性弱点:
- 一个不监听 signal 的 Promise 无法被取消——
Promise.race只是"不再等待",不是"终止"; - 取消后清理靠各自 finally,没有"组级联动撤侨";
- 组合信号存在已知坑:
AbortSignal.any()跟随 timeout 信号时曾出现"加删监听后永不触发"的缺陷(https://github.com/nodejs/node/issues/66610 )。
横轴判断:取消语义上 Trio ≈ asyncio > Node(AnyIO 把 Trio 语义同时带给两个后端,不单独参与排序)。Trio 仍是语义金标准(与上文及生态表口径一致),asyncio 经 TaskGroup/asyncio.timeout 已逼近之;唯一可指认的残留差距是 async generator 取消边界——PEP 789(仍 Draft)落地后两者对齐(见阶段五)。Node 的模型简单且与浏览器同构(一套 AbortSignal 通吃前后端),但把"取消的完整性"责任完全压给应用开发者——这正是 Python 社区当年发明 nursery/cancel scope 要解决的问题。
超时:作用域 vs 挂件
- asyncio:
asyncio.timeout()(3.11+)是作用域化超时——上下文管理器包裹的任意一段 await 代码整体限时,内部任务在超时时被统一取消,与 TaskGroup 叠加语义干净。 - Node.js:超时是操作级挂件——
AbortSignal.timeout()挂在单个操作上;要对"一段逻辑"限时,得手动AbortSignal.any([timeoutSignal, controller.signal])再把 signal 传遍这段逻辑里的每个异步调用,或退化为泄漏式Promise.race(超时的那个 Promise 仍在后台跑)。没有等价于asyncio.timeout()的区间原语。
资源清理:Python 领先十余年,JS 正在补课
- asyncio:
async with是语言语法,__aexit__保证执行;AsyncExitStack支持动态资源栈;TaskGroup 的退出点保证所有子任务终结后代码才继续——"离开作用域即无孤儿任务"是结构化并发的核心承诺;async generators 有shutdown_asyncgens兜底,3.13 的Queue.shutdown()补上管线关闭。 - Node.js:长期只有 try/finally。转折点是 TC39 显式资源管理提案:
using/await using声明、DisposableStack/AsyncDisposableStack、逆序清理、SuppressedError——已进入 Stage 4 并列入 ES2026(https://github.com/tc39/proposal-explicit-resource-management ),与 C# 的using和 Python 的with同构。需要注意落地节奏的不对称:Node 24(2025-05)已随提案落地using/await using,但这是"运行时先于 ES 年度规范落地",跨引擎普及与生态迁移仍在进行。本维度的横轴结论:JS 生态在 2025–2026 年才补齐 Python 自 PEP 343(2005,with)与 3.5(2015,async with)就有的语法级清理保证。 - 补充:Node 的
AsyncLocalStorage(https://nodejs.org/api/async_context.html )在"跨 await 传播请求上下文"上是 JS 侧少有的领先点,但领先不在时间:contextvars随 Python 3.7(2018-06)进入标准库即稳定,AsyncLocalStorage 则 Node 13.10 才实验化、16.4 才转正;其差异化价值在于由运行时钩子(async_hooks)原生贯通整条异步调用链,而非更早或已证实的"更广"。
可观测性与调试
asyncio 在 2025–2026 年完成可观测性跃迁:3.14 的内省 CLI(ps/pstree,画任务树、发现 await 图中的环)与 capture_call_graph()/print_call_graph();3.15 的 Tachyon 采样剖析器支持 --async-aware,能按任务重建异步栈。Node 方面 async_hooks/AsyncLocalStorage 生态更早成熟,但 2026-01-13 的安全发布曾专门缓解 async_hooks 相关的 DoS 漏洞(官方公告:https://nodejs.org/en/blog/vulnerability/january-2026-dos-mitigation-async-hooks ,涉及 v22.22.0/v24.13.0/v25.3.0)——深度 hook 的性能与安全代价是其隐忧。
性能与基准:参考系本身正在退役
横向对比绕不开基准参考系问题:TechEmpower Framework Benchmarks 第 23 轮(数据日期 2025-02-24,博客 2025-03-17)已是最后一轮,项目正式宣布 sunset(https://www.techempower.com/blog/2025/03/17/framework-benchmarks-round-23 ;退役 issue:https://github.com/TechEmpower/FrameworkBenchmarks/issues/10932 )。因此"Node 吞吐高于 Python"这类历史结论已无持续更新的权威基准可校验,本报告将其降级为"历史趋势"而非当前事实。可验证的现状是:uvloop 活跃维护(PyPI 最新版 0.23.0,2025 年 10 月仍有更新),微软官方博客(2025-12)宣布 Azure Functions 已将 uvloop 设为 Python 3.13+ 的默认事件循环(https://techcommunity.microsoft.com/blog/appsonazureblog/faster-python-on-azure-functions-with-uvloop/4455323 );uvloop"至少 2 倍快于 Node.js"为项目 README 早年自述,针对的是 asyncio 默认循环而非 Node,且未在本会话实测复现,不应作为当前事实引用。
生态与成熟度:Python 侧收敛,JS 侧分裂
Python 异步生态(2026-11 截面,状态均来自横轴章节当次检索):
| 方案 | 状态(2026-11-03) | 定位 |
|---|---|---|
| asyncio | 标准库,3.15(2026-10)持续增强 | 默认底座(https://docs.python.org/3/whatsnew/3.15.html ) |
| Trio | 0.35.0(2026-10-31 发布),非常活跃 | 结构化并发语义金标准(https://pypi.org/project/trio/ ) |
| AnyIO | 4.x 活跃 | Trio 语义 × asyncio 后端;Starlette/httpx 底座(https://github.com/agronholm/anyio/releases ) |
| curio | 已废弃:作者宣布 "ten years later, I've decided to abandon",最后版本 1.6(2022) | 历史影响(启发 Trio/asyncio)(https://github.com/dabeaz/curio ) |
| Twisted | 发布列车 25.5.0,仍在维护 | 老牌网络框架,asyncio 前时代(https://www.twisted.org ) |
| Tornado | 6.5.0 起支持 3.14 与自由线程,当前 6.6 | 老牌 Web 框架,已兼容 asyncio(https://github.com/tornadoweb/tornado ) |
| gevent | 25.9.1 活跃,但不支持自由线程构建(官方安装文档声明:https://www.gevent.org/install.html ;文档化 issue:https://github.com/gevent/gevent/issues/2127 ) | 猴子补丁式同步风格并发(https://github.com/gevent/gevent ) |
| uvloop | 0.23.0 活跃 | asyncio 循环加速器(libuv 绑定)(https://github.com/MagicStack/uvloop ) |
社区已在 2026 年 2 月提出"把 anyio/Trio 验证过的结构化并发模式多版本路线图式吸收进 asyncio"的正式讨论(https://discuss.python.org/t/adopt-proven-anyio-trio-patterns-natively-into-asyncio-multi-release-roadmap/106067 ),3.15 的 TaskGroup.cancel() 可视为该路线图的首个落地。
JS 运行时三兄弟(2026-11 截面):Node.js 26 "Lithium"(libuv,事实标准,AbortSignal/AsyncLocalStorage/undici 生态最全)、Deno(V8 + Tokio,Web 标准 API 优先)、Bun(JavaScriptCore + Zig 自研循环,启动与 IO 性能激进,兼容 npm 生态)。注意一个横向不对称:JS 侧是"一套 Web 标准取消/清理 API(AbortSignal、using),三个运行时共同遵守";Python 侧是"一个标准库 + 一套更严谨的民间语义(Trio)+ 兼容层(AnyIO)"。前者碎片化程度低但语义上限也低,后者语义上限高但需要 AnyIO 这类桥梁。
跨语言范式竞品:本课题真正的对手
| 方案 | 取消 | 超时 | 清理 | 状态(2026-11) |
|---|---|---|---|---|
| Go | context.Context 显式传递 | context.WithTimeout 作用域式 | defer 语法级 | 稳定(既有知识,未逐一检索验证) |
| Java 虚拟线程 + 结构化并发 | Thread.interrupt + StructuredTaskScope | scope.joinUntil(deadline) | try-with-resources | 虚拟线程 Java 21 定稿(https://openjdk.org/jeps/444 );结构化并发 JDK 25 仍为第五预览(https://openjdk.org/jeps/505 ) |
| Kotlin 协程 | Job.cancel() 挂起点注入 CancellationException,接近 asyncio | withTimeout 作用域式 | try/finally + SupervisorJob | 稳定(既有知识,未逐一检索验证) |
| Rust tokio | CancellationToken + select! | tokio::time::timeout | RAII/Drop 编译期保证 | 活跃(既有知识,未逐一检索验证) |
范式级洞察:Go/Java 用"调度器隐藏复杂性"换走开发者的心智负担,但 Java 的结构化并发历经五次预览仍未定稿,说明 asyncio/Trio 在 2018 年就解决的问题(取消的作用域化、一败全撤)在工业级语言里有多难。反过来,TaskGroup(3.11)、asyncio.timeout()(3.11)与 TaskGroup.cancel()(3.15)让 Python 在"结构化并发语义完备度"上领先所有主流语言的标准库——这里说的一脉是:Trio 提出语义(金标准)、AnyIO 桥接双后端、asyncio 标准库吸收落地——这是 2026 年截面上最值得记录的横向结论。
交叉洞察:两轴结合说明了什么
洞察一:横轴的领先位势,是纵轴上"先吃过亏"的结果
单看横轴,asyncio 在取消/超时/清理三个维度的语义完备度领先 Node,容易读成"Python 设计得更好"。把纵轴叠上来,因果链就清晰了:Node 的孤儿任务、取消丢失、静默失败等问题同样发生过(Node 15 把未处理拒绝改成崩溃就是总清算),但 Node 的修正受制于 Web 标准同构约束——AbortController 必须和浏览器长得一样,using 必须等 TC39 全票。Python 则没有这个包袱:Trio 2017 年发布即提出 nursery/cancel scope,五年后(以 2017 年发布计;3.11,2022-10)这套语义直接进标准库,2026 年(3.15 TaskGroup.cancel())仍在按路线图吸收。结论:语义差距不是智力差距,而是"能不能自由吸收社区最新研究成果"的治理差距。 对用户的含义:看一个运行时的并发语义前景,别只看它现在有什么,要看它的提案通道有多短——Python 的 PEP 通道 + Discuss 路线图,明显短于"TC39 Stage 4 → 引擎落地 → LTS 普及"的 Web 标准链路。
洞察二:两条演进路径的引力源不同,2025–2026 年原语形态却明显趋同
纵轴显示两条线的"引力源"截然不同:Node 的每一次关键升级都指向 Web 标准(AbortController → fetch → AbortSignal.timeout/any → TC39 ERM),本质是向浏览器生态对齐;Python 的关键升级则来自"吸收竞品"——循环引擎吸收 libuv(uvloop),并发语义吸收 Trio(TaskGroup/timeout/PEP 789),连 eager task 都在借鉴 JS Promise 的立即求值。但横轴截面显示,两者在 2025–2026 年呈现原语形态上的趋同:作用域化取消(cancel scope/TaskGroup vs AbortSignal.timeout/any)、确定性清理语法(async with vs await using)正在变成两种语言的共同默认。趋同止步于原语形态:"组级一败全撤"的结构化并发仍是 Python 独有——Node 的 AbortSignal.any 只是把多个信号拼在一起,每个操作仍各自决定如何响应,没有"作用域退出即所有子任务终结"的组语义(见横轴"取消"一节)。结论:并发 API 的演进方向由"生产事故 + 学术/社区研究"共同决定,与语言厂商的初衷无关;原语形态的趋同不是巧合,是同一个问题域的最优解在收敛,而语义上限的分档(有无组级结构化并发)依旧由治理通道决定。
洞察三:事件循环引擎已经商品化,差异全部沉淀在语义层
两轴结合看 libuv 的命运最有意思:2011 年它为解决 Windows 支持而生,2016 年被 Python 侧拿去造 uvloop("Python 用了 Node 的库"是当时的标志性叙事),2022 年前后又被 Deno(Tokio)和 Bun(Zig 自研)抛弃。epoll/kqueue/IOCP 的多路复用封装早已是成熟商品,Tokio、Zig 实现、libuv 在"引擎层"没有本质代差。结论:这个课题五个维度(调度/阻塞/取消/超时/清理)里,引擎层的竞争已经结束,真正的差异全部沉淀在语义层——谁的取消更完整、谁的清理更确定。这解释了为什么 uvloop 能(按其自述口径与已退役基准的历史趋势)抹平大部分性能差距,却抹不平取消语义差距。
洞察四:性能叙事不可选型——纵轴上的性能快照都是营销截面
纵轴上出现过两次标志性性能叙事:2016 年 uvloop"部分基准超过 Node",以及历年 TechEmpower 榜单上 JS 框架的排位领先。横轴截面则揭示了两者的共同命运:uvloop 的"快 2 倍于 Node"是 README 早年自述,TechEmpower 在 R23(2025-02 数据)后正式退役,当前不存在可校验"asyncio vs Node 吞吐"的权威第三方基准。两轴结合的教训:性能对比的结论有强烈的时间截面性,引用任何性能数字前必须先问"哪一轮基准、谁的自述、引擎什么版本"。在 2026 年做选型,性能不应作为 asyncio vs Node 的一票否决项——机制事实(V8 JIT、uvloop 2–4 倍于默认循环的自述口径)只能支撑"差距不大、可用工程手段抹平"的弱结论,且这是推断性结论:无现行权威基准可证,仅与已退役基准的历史趋势方向一致。
判断与建议(2026-11 截面)
- 选 Python asyncio:Python 资产密集(数据/AI/爬虫/科学计算)、需要结构化取消语义、愿意用 uvloop 补性能、看重标准库统一。3.14 内省 CLI + 3.15
TaskGroup.cancel()使运维可观测性显著改善;新项目直接 asyncio + TaskGroup。追求极致取消语义(cancel scope 随处可用)用 Trio,或用 AnyIO 写跨后端库;不要启动任何基于 curio 的新项目(已废弃);gevent 项目注意与自由线程构建不兼容。 - 选 Node.js 26:全栈 JS/TS、IO 网关与 BFF、需要 AbortSignal 跨端同构(浏览器/Deno/Bun 一套 API)、需要 JIT 级 CPU 回调速度。代价是"取消完整性靠自己",并应在
using/await using可用的版本上尽快迁移清理逻辑;警惕 libuv 线程池默认 4 线程且与dns.lookup共池的隐性阻塞。 - 两者共同的工程纪律:永远不要在事件循环里写阻塞调用——这是两家共同的第一死穴,区别只是定位手段(Python 用
python -m asyncio ps/pstree直接看任务树;Node 用perf_hooks.monitorEventLoopDelay()采集循环延迟直方图、perf_hooks.eventLoopUtilization()看循环占用率,https://nodejs.org/api/perf_hooks.html );超时与取消要成对设计,超时不是取消的替代品。 - 新起的高并发服务,警惕 L3:如果团队接受"同步思维",Go 与 Java 虚拟线程把阻塞问题从语言层面消除了。asyncio/Node 的核心竞争力在于各自生态的库资产与跨端同构能力,而非并发模型本身的先进性——承认这一点,才能把选型依据放回"团队语言资产"这个真正重要的变量上。
- 关注两个活跃战线:PEP 789(async generator 与 TaskGroup 的取消边界,仍 Draft)落地后将改变 Python 侧的取消正确性规则;ES2026
using的跨引擎普及将改变 JS 侧清理代码的写法。这两项是未来 1–2 年内本课题五个维度中最可能发生变化的变量。
开放问题与下一步(2026-11 截面)
本报告多处自证"证据缺口"(性能无权威基准、Node 无组级结构化并发、PEP 789 将改规则、自由线程只给了想象空间),这里把读者必然会追问的四个问题摆上桌面,并给出当下可行的落点:
- 无权威基准后如何自行验证性能:TechEmpower 退役后,asyncio vs Node 的吞吐对比只能自测。可行做法:按自身生产的 IO 画像构造最小基准(如 N 路并发 keep-alive 请求 + JSON 编解码 + 一次数据库往返),固定运行时版本(CPython 3.15 vs Node 26;Python 侧默认循环与 uvloop 各测一组)、固定机器与连接参数,多轮取 P99/中位数而非均值;结论只对被测画像负责,不外推为"语言级快慢"。延迟健康度可用运行时自带指标:Python 开 asyncio debug 模式看 slow callback 告警(
loop.slow_callback_duration),Node 用perf_hooks.monitorEventLoopDelay()/eventLoopUtilization()(https://nodejs.org/api/perf_hooks.html )。 - JS 侧结构化并发的社区补救:Node 至今没有标准库级的 TaskGroup 等价物(见横轴"取消"一节)。当下的补救有两条路:a) 用 AbortSignal 组合 +
using/await using自行封装"失败即全撤、退出即全终结"的迷你作用域——能覆盖简单场景,但语义完备度远低于 cancel scope;b) 引入把结构化并发做成一等模型的库,如 Frontside 的 Effection(https://frontside.com/effection/ ,官方自述 "Structured Concurrency and Effects for JavaScript",generator 式操作树、确定性取消与无泄漏清理)。两条路都印证:组级结构化并发是 Web 标准尚未覆盖的空档,而非 Node 开发者不需要。 - PEP 789 落地的破坏面:按现稿(Draft),机制是新增
sys.prevent_yields(reason)作用域——在 TaskGroup/asyncio.timeout作用域内,async generator 的yield不再挂起帧而是抛RuntimeError(await不受影响;@contextmanager/@asynccontextmanager等生成器上下文管理器拟获豁免,机制未定);拟议迁移路径为 3.14 asyncio 调试模式 DeprecationWarning → 3.15 默认告警 → 3.16 硬错误(https://peps.python.org/pep-0789/ ,本会话抓取 PEP 原文核验)。典型破坏面:逐项限时包装器(timeout-per-item)、共享队列上的 fan-in 生成器、yield 心跳消息的 websocket 包装。受影响代码需在硬错误前改为"物化消费"或把生成器移出结构化作用域——建议 3.15 起 CI 中默认开启 asyncio debug 模式提前暴露。 - 自由线程与 asyncio 的配合方式:自由线程不会让单个事件循环变并行——asyncio 仍是单线程模型。实际受益路径有三:①
asyncio.to_thread()/默认 executor 中的 CPU 型调用不再因 GIL 排队,线程池成为真并行;② 单进程"每线程一个事件循环"的多循环服务模式,其纯 Python 计算部分可真并行(需用asyncio.new_event_loop()自行组装,无官方一站式 API);③ 原本靠释放 GIL 的 C 扩展路径与自由线程叠加。硬约束在生态兼容:gevent 明确不支持自由线程构建(见生态表),基于扩展的加速方案迁移前需逐一验证。
两章口径消歧说明
综合过程中发现并消解的三处章节间不一致:
- TC39 显式资源管理的落地状态:纵轴章节称 Node 24(2025-05)已通过该提案落地
using/await using;横轴章节则强调提案"2025 年进入 Stage 4、列入 ES2026,引擎正在落地",易读成"尚未有运行时实现"。本报告统一为:提案 2025 年进入 Stage 4 并列入 ES2026,Node 24+ 是已落地的运行时之一,"补课"指的是跨引擎普及与生态迁移仍在进行,而非无实现。 - uvloop 性能数字口径:纵轴章节写"性能约 2 倍,部分基准超过 Node";横轴章节写"自述较默认 loop 快 2–4 倍",并明确"至少 2 倍快于 Node.js"为 README 早年自述、不可作为当前事实。本报告统一采用横轴口径:2–4 倍的对照物是 asyncio 默认循环,"超过 Node"是 2016 年发布时的营销叙事,且 TechEmpower 退役后无权威基准可校验。
- Node 24 时间线:纵轴章节写"2025-05 发布、2025-10-28 进入 LTS";横轴章节表格简写为"2025-10 LTS"。本报告统一为完整表述:2025-05 发布、2025-10-28 进入 LTS,2026-10-28 起 Node 26 "Lithium" 接任 Active LTS、Node 24 转 maintenance。
参考来源
PEP 与 Python 官方
- PEP 3156(asyncio/Tulip):https://peps.python.org/pep-3156
- PEP 703(去 GIL 实现提案):https://peps.python.org/pep-0703/
- PEP 789(async generator 取消边界,2026-11-03 核验为 Draft):https://peps.python.org/pep-0789/
- CPython issue #63461(asyncio 并入 3.4):https://github.com/python/cpython/issues/63461
- Python 3.13 What's New(Queue.shutdown):https://docs.python.org/3/whatsnew/3.13.html
- Python 3.14 What's New(自由线程 PEP 779、asyncio 内省 CLI):https://docs.python.org/3/whatsnew/3.14.html
- Python 3.15 What's New(TaskGroup.cancel()、Tachyon --async-aware):https://docs.python.org/3/whatsnew/3.15.html
- asyncio 任务/超时/TaskGroup 官方文档:https://docs.python.org/3/library/asyncio-task.html
- PEP 654 后续讨论串(ExceptionGroup/TaskGroup):https://discuss.python.org/t/next-steps-after-pep-654-exceptiongroups-taskgroup-etc/12912
- asyncio 结构化并发路线图讨论(2026-02):https://discuss.python.org/t/adopt-proven-anyio-trio-patterns-natively-into-asyncio-multi-release-roadmap/106067
- LWN:Guido PyCon 2013 演讲报道:https://lwn.net/Articles/544522
- Beazley, "Python Gets an Event Loop (Again)"(USENIX ;login):https://www.usenix.org/publications/login/june14/beazley
Node.js 与 Web 标准
- Node.js 历史(RisingStack 时间线):https://blog.risingstack.com/history-of-node-js ;Node.js Wikipedia:https://en.wikipedia.org/wiki/Node.js
- io.js 分叉(InfoWorld):https://www.infoworld.com/article/2236057/nodejs-gains-a-new-fork-much-to-joyents-dismay.html ;合并(InfoQ):https://www.infoq.com/news/2015/05/nodejs-iojs
- Node.js 历代版本与 LTS 时间线:https://nodejs.org/en/about/previous-releases
- Node 15 unhandled rejection 提案(nodejs/node#20392):https://github.com/nodejs/node/issues/20392
- Node.js 官方文档(AbortController/AbortSignal.timeout 版本):https://nodejs.org/api/globals.html
- Node.js 事件循环官方讲解(五阶段与 nextTick):https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick
- Node.js 2026-01 安全发布(async_hooks DoS 缓解公告,2026-01-13):https://nodejs.org/en/blog/vulnerability/january-2026-dos-mitigation-async-hooks
- Node perf_hooks(monitorEventLoopDelay/eventLoopUtilization):https://nodejs.org/api/perf_hooks.html
- libuv 线程池文档(默认 4 线程):https://docs.libuv.org/en/v1.x/threadpool.html
- Node AsyncLocalStorage(async_context):https://nodejs.org/api/async_context.html
- MDN AbortSignal:https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal ;MDN AbortSignal.timeout:https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static
- AbortController 实战教程(AppSignal):https://blog.appsignal.com/2025/02/12/managing-asynchronous-operations-in-nodejs-with-abortcontroller.html
- nodejs/node#66610(AbortSignal.any 组合缺陷):https://github.com/nodejs/node/issues/66610
- TC39 Explicit Resource Management 提案(tc39.es):https://tc39.es/proposal-explicit-resource-management ;(GitHub,Stage 4 / ES2026):https://github.com/tc39/proposal-explicit-resource-management
- Node 24 发布综述:https://medium.com/@Brilworks/whats-new-in-node-js-24-67e6ead19394
生态项目
- uvloop:https://github.com/MagicStack/uvloop ;2016 年发布报道:https://www.reddit.com/r/programming/comments/4hqd1b/uvloop_make_python_networking_great_again ;Azure Functions 启用 uvloop(微软官方博客,2025-12):https://techcommunity.microsoft.com/blog/appsonazureblog/faster-python-on-azure-functions-with-uvloop/4455323
- Trio:https://pypi.org/project/trio/ ;https://trio.readthedocs.io
- AnyIO:https://github.com/agronholm/anyio/releases ;https://anyio.readthedocs.io
- curio(废弃声明):https://github.com/dabeaz/curio ;https://pypi.org/project/curio
- Twisted:https://www.twisted.org ;Tornado:https://github.com/tornadoweb/tornado ;gevent:https://github.com/gevent/gevent
- gevent 自由线程不支持声明(官方安装文档):https://www.gevent.org/install.html ;文档化 issue #2127:https://github.com/gevent/gevent/issues/2127
- nest-asyncio 停止维护归档(jupyter/nbclassic#328):https://github.com/jupyter/nbclassic/issues/328 ;Python 3.14 构建失败实例(NixOS/nixpkgs#474439):https://github.com/NixOS/nixpkgs/issues/474439
- Effection(Frontside,JS 结构化并发库):https://frontside.com/effection/
- Deno 官方(Tokio 作为事件循环):https://deno.com/blog/roll-your-own-javascript-runtime
- Bun/JSC 架构讨论(HN,置信度中等):https://news.ycombinator.com/item?id=31993429
基准与跨语言
- TechEmpower R23(最后一轮)博客:https://www.techempower.com/blog/2025/03/17/framework-benchmarks-round-23 ;退役公告 issue:https://github.com/TechEmpower/FrameworkBenchmarks/issues/10932
- JEP 444(虚拟线程定稿):https://openjdk.org/jeps/444 ;JEP 505(结构化并发第五预览):https://openjdk.org/jeps/505
- JDK 25 结构化并发状态综述:https://howtodoinjava.com/java/multi-threading/structured-concurrency
- C10K 问题:https://en.wikipedia.org/wiki/C10k_problem
章节稿(本报告的直接输入)
- 纵轴章节:
D:/CodexData/nightshift/output/reports/parts/2026-11-03-asyncio-nodejs-eventloop-vertical.md - 横轴章节:
D:/CodexData/nightshift/output/reports/parts/2026-11-03-asyncio-vs-nodejs-eventloop-horizontal.md