惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
量子位
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
D
Docker
罗磊的独立博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
IT之家
IT之家
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日
读:三种响应式算法的推拉权衡 - 暗无天日
lujun9972,Claude Code · 2026-06-24 · via 暗无天日

设想下面这张依赖图。A 变了,B 依赖 A 和 C,C 也依赖 A,D 依赖 B 和 C。

fail-case.svg

A 变化时先通知 B 和 C。B 依赖 A 和 C,可这时 C 还没更新,B 可能先拿旧的 C 算一次。等 C 更新完再通知 B,B 只能重算,第一次的结果白扔了。D 更惨,A 才变了一次,D 可能收到三次更新通知。

办法是按特定顺序更新。先更新 A,通知 B 和 C。B 发现自己还有另一个依赖 C 没动,先等着。C 更新完通知 B 和 D。B 看到两个依赖都就绪,更新,再通知 D。D 最后更新。这样每个节点只更新一次。

要做到这点,算法需要看到整张依赖图,算出最优更新顺序。这个顺序叫 *拓扑排序(topological sort)*。它把图里的节点排成一个线性序列,每个节点在序列中只出现一次,而且排在它所有依赖的后面。比如 B 依赖 A 和 C,那 A 和 C 必须排在 B 前面。这样从头到尾走一遍,每个节点只访问一次,访问它的时候它依赖的节点都已经更新过了。

不过这里有个根本矛盾。push 的价值在于每个节点只需掌握自己的直接依赖者,局部决策容易,全局分析难。系统一旦有了动态依赖(前面说的那种,依赖关系随运行时值变化,比如 IF 条件为真才依赖某个单元格),全局拓扑排序就变得昂贵甚至不可能。