确定性并发
文章摘要
这是 ICFP 2026(ACM SIGPLAN 国际函数式编程会议)三场主题演讲之一,由加州大学伯克利分校荣休教授 Edward A. Lee 主讲,时间是 2026 年 8 月 25 日上午,地点在 IP126 礼堂,主持人是 Inria 的 Manuel Serrano。演讲 50 分钟,另有 10 分钟问答,录像由 ACM SIGPLAN 官方频道发布在 YouTube。同届另外两场主题演讲分别是 Lindsey Kuper 的「Interpreters everywhere!」和 Daan Leijen 关于带效应的函数式编程的报告。
(说明:YouTube 页面对抓取要求登录验证,本文没能拿到字幕。下面的内容依据 ICFP 官方页面的演讲摘要、讲者简介、Lee 公开的研究工作,以及 HN 评论中观众对演讲内容的转述整理而成。)
一个”自相矛盾”的题目。 Lee 在摘要里开门见山:计算机科学的早期文献常把并发和非确定性画等号,把两者一起看成理解程序时遇到的深刻难题。照这个传统,「确定性并发」这个题目本身就是个矛盾修辞。可非确定性通常被定义为”相同输入下表现出可观察到的不同行为”,而几乎所有程序在相同输入下都会表现出可观察的差异,比如输出产生的时刻。除非你在设计最严格的实时系统,否则不会把输出的时间算作”行为”的一部分。那么输入到达的时间算不算呢?
把确定性看作模型的属性。 这是演讲的核心立场:确定与否,说的是我们用来描述系统的模型,跟物理系统本身无关。物理世界里的线程调度、网络延迟、时钟漂移都充满不确定,但工程师用来描述和推理系统的模型可以是确定的,就像电路设计者用同步数字逻辑这种确定模型来描述本质上是模拟、充满噪声的晶体管。Lee 进一步提出三个与主流做法相左的论断:第一,与几乎所有现行实践相反,确定性在并发和分布式软件系统里有巨大价值;第二,确定性模型本身并不必然带来性能代价;第三,确定性模型会让容错系统的设计变得更容易,而不是更难。
背景:Lee 的长期主张。 Lee 在伯克利任教近四十年,研究方向是信息物理系统(cyber-physical systems),即把物理动态、软件和网络整合在一起的系统,他一直把确定性模型作为这类系统工程工具箱的核心。他 2006 年的论文《The Problem with Threads》影响很大,文中批评线程模型把非确定性当成默认,再靠锁和信号量去”修剪”,结果几乎不可能写对;他主张反过来,以确定性的并发模型为默认,只在确实需要时显式引入非确定性。他主导开发的开源项目 Ptolemy(异构建模与仿真框架)和 Lingua Franca(基于 reactor 和逻辑时间的协调语言)都是这一思路的实践。Lingua Franca 中的 reactor 之间用带逻辑时间戳的事件通信,同一逻辑时刻内的反应按照确定的依赖顺序执行,于是多个确定性组件组合在一起仍然是确定的,同时运行时可以在不违背依赖的前提下充分并行。从 HN 评论的转述看,演讲还提到了 Google Spanner(Spanner 以带不确定窗口的同步物理时钟协调分布式事务),以及 Reactor 模型如何让确定性组件组合后依然确定,不过具体细节需要看视频本身。
为什么这对函数式编程社区重要。 函数式编程一向看重引用透明和可推理性,而并发恰恰是最容易破坏这些性质的地方。Lee 的论点等于告诉这个社区:并发不必以放弃确定性为代价,确定性也不只是测试、调试和复现 bug 时的便利,它可以是构建分布式系统和容错系统的基础。讲者简介里提到他是 BDTI 和 Xronos 两家公司的联合创始人,后者致力于把 Lingua Franca 这类确定性协调技术推向工业应用。简介还列出了他获得的一长串奖项,包括 2026 年 HSCC 和 ICCPS 两项”时间检验奖”,说明他十几二十年前关于确定性建模的论文至今仍被视为有持续影响。
HN 评论精华
本帖 90 分,但只有 6 条评论,讨论相当稀少,以下是全部有实质内容的发言。
jeffreygoesto 看到标题第一反应就是”Edward Lee”,点开果然如此。他推荐了 Lee 的经典论文《The Problem with Threads》,并提到这些工作启发了不少工业实践(他附了 ETAS 一个嵌入式工具链项目的链接)。他还感叹:真想看看 Lee 和 Erlang 之父 Joe Armstrong 如果合作会是什么样子。
CoolestBeans 说这个演讲”远超自己的水平”,但很有启发:解释为什么有人想要确定性模型,反过来也让他明白了为什么有人想要非确定性模型。只要能让你在乎的性质保持不变,具体实现怎么样都无所谓。处理故障时你也许不想用确定性并发模型,关键是绕开实际实现中遇到的非确定性。这正是 Erlang 的思路:承认系统中有非确定的部分,但让从中恢复的过程是确定的。他设想可以把故障作为一种输入纳入 Reactor 模型,再对故障恢复建模。他觉得 Reactor 模型最有意思的地方在于:你不必接受”两个确定性进程组合起来就自动变成非确定”这件事,这对真实系统一定非常有用。
jzelinskie 希望演讲对 Spanner 的引用能更具体一些,觉得现在讲得有点含糊。如果指的是用带不确定窗口的同步物理时钟,那这个窗口的容差适合把事务批在一起,但大概不适合程序内部每一个因果依赖;如果指的是等待逻辑时钟的不确定窗口,那不就是把一切串行化了吗?他表示会去多读一些相关工作。
anonymousDan 回忆说,确定性或稳定多线程曾是系统研究里的一个热门方向,但据他所知一直没怎么被采用,多半是因为性能问题。他还没看完视频,想看看讲者怎么回应这一点(这恰好是摘要里”确定性并不必然带来性能代价”那一论断要回答的问题)。
yvdriess 建议在讨论并发和并行计算时使用”determinate”(确定结果性)这个词,它强调结果相同,而把”deterministic”留给”事件序列(调度)完全相同”的含义。他引用了 Jack Dennis 和 Arvind 的用法,最早的定义则来自 Karp 和 Miller。tancop 接话说这和 Nix 背后的公司 Determinate Systems 的名字正好对上:Nix 也是追求每次得到相同结果,哪怕构建过程内部一团混乱。