首页 › programming › 并发不是并行:结构决定一切

并发不是并行:Rob Pike神课深读

概述

后端面试必考的“并发与并行的区别”,99%的人背了定义却从没真正分清过。这场由 Go 语言联合创始人 Rob Pike 在 Heroku Waza 大会发表的演讲《Concurrency Is Not Parallelism》,用几只推独轮车的地鼠,把这个问题讲成了一场关于程序结构观的革命:并发是你如何组织问题,并行是你如何执行问题。Go 语言的 goroutine 与 channel、今天 Java 虚拟线程与 Kotlin 协程的设计哲学,都能在这场演讲里找到源头。本文按演讲叙事顺序逐层拆解,补上理论溯源、工程证据与批判性审查——看完这篇,你获得的不是一个名词解释,而是一套可以先于代码使用的并发设计方法。

说明:本轮写作环境无法实时抓取外部页面,以下视频信息依据长期稳定的公开记录与 Go 官方博客的正式公告整理,无法核验的数据均已注明,未标注任何凭空编造的精确数字。

视频基本信息

项目 内容
标题 Concurrency Is Not Parallelism(并发不是并行)
频道 Heroku 官方 YouTube 频道
演讲人 Rob Pike(贝尔实验室出身,UTF-8 合著者,Go 语言联合创造者)
演讲场合 Heroku Waza 开发者大会,2012 年 1 月
上线时间 录像发布于 Heroku 官方频道,Go 官方博客曾于 2014 年 1 月发专文推荐(据 The Go Blog 公告,未实时核验)
热度 Go 并发主题引用度最高的演讲之一,长期被官方文档、教材与社区反复引用;具体播放量本轮无法核验,故不标数字(据 Go 官方博客与社区长期流传)
链接 youtube.com/watch?v=f6kdp27TY8s

一、开场:两个被混用了三十年的词

要理解这场演讲为什么“封神”,得先回到 2012 年的语境。那一年,智能手机全面多核化,服务器 CPU 核数一路上涨,而 Herb Sutter 在 2005 年发表于 Dr. Dobb's Journal 的著名文章《The Free Lunch Is Over》(免费午餐结束了)早已预言:处理器的单线程性能曲线已经到头,主频在 3–4GHz 附近撞上功耗墙(2004 年前后 Intel 砍掉 4GHz Pentium 4 计划就是标志),软件的性能红利从此只能靠并行去挖。

问题是,整个行业的词汇表还没跟上。工程师张口“并发”闭口“并行”,把它们当成同义词,或者粗暴地理解为“并发是逻辑概念、并行是物理概念”这种没有行动指导意义的空话。Rob Pike 在演讲开头做的第一件事,就是给这两个词重新划界,他那两句定义后来被无数文章引用:

注意这两个动词的差别:dealing 与 doing。并发是设计决策,并行是物理事实。Pike 的核心断言由此展开:并发是一种更好的程序结构,而更好的结构让并行变得容易。反之,一个结构混乱的程序,给它再多的核也快不起来。

这个区分的价值在于它是可操作的。它告诉你:当你想提升多核利用率时,第一步不是加线程,而是先把程序的组织方式改对。

二、三只地鼠:一个寓言讲透全部

演讲最出名的部分,是那组手绘的地鼠(gopher)动画。场景朴素到近乎幼稚:两堆书之间要搬书。

第一种配置:一只地鼠,一辆独轮车。 这是顺序执行。地鼠把书装车、推过去、卸车、推回来、再装车。瓶颈一目了然:装卸车的时间里,地鼠(CPU)闲着。这对应程序里最典型的 I/O 等待——数据库查询、网络请求、磁盘读写期间,执行流原地阻塞。

第二种配置:还是一只地鼠,两辆独轮车。 神奇的事情发生了:一辆车在装货时,地鼠去推另一辆车。没有增加任何人力(还是单核),总吞吐几乎翻倍。这就是并发而未并行——只有一件事在“做”,但多件事在“被应对”。Pike 用它证明了一个违反直觉的结论:并发的收益不需要多核也能兑现。只要你的结构允许“等待时切换”,阻塞的成本就被隐藏掉了。这正是所有协程、虚拟线程、异步运行时在工程上的立身之本。

第三种配置:两只地鼠,两辆车。 这才是并行。而此刻 Pike 图穷匕见:因为第二种配置里结构已经是并发的,第二只地鼠只需要复用地鼠一号的工作方式,吞吐立刻再翻倍——不需要重新设计,不需要加锁协议的大讨论,就是“再雇一只地鼠”。

这组寓言有三层含义,层层递进:

  1. 并发设计让并行化退化为“加人”这种不动脑的操作。结构对了,扩容是复制;结构错了,扩容是重构。
  2. 阻塞不再是成本,而是信息。一个阻塞点就是一次可以安全切换的机会,好的并发结构把等待变成线索而不是垃圾。
  3. 即使永远不并行,并发结构也更清晰。每只地鼠职责单一,这是把“关注点分离”应用到时间维度上。

三、Go 的三件套与四十年前的血统

寓言之后,演讲进入工程落地:Go 语言如何把“地鼠模型”变成语法。三件套分别是:

整场演讲传播最广的一句话在此落地:Don't communicate by sharing memory; share memory by communicating(不要靠共享内存来通信,要靠通信来共享内存)。

而这套设计的学术血统,Pike 在演讲里大方承认,全部来自 Tony Hoare 1978 年发表在《Communications of the ACM》上的经典论文《Communicating Sequential Processes》(通信顺序进程,CSP)。Hoare——就是那位发明了快速排序和“空引用是十亿美元错误”论断的图灵奖得主——在 1978 年就提出:与其让多个执行流靠锁争夺共享内存,不如让它们通过命名通道做点对点通信。CSP 后来发展为带形式化语义的进程代数,甚至有 FDR 这样的模型检查工具可以数学化地验证死锁自由。1980 年代 INMOS 的 Transputer 芯片配套的 occam 语言,是 CSP 的第一次大规模工程化。

演讲中没有展开、但理解这场演讲必须要补的一课,是 CSP 与 Actor 模型的分野。Actor 模型由 Carl Hewitt 等人于 1973 年提出,1986 年 Ericsson 的 Joe Armstrong 等人把它做成 Erlang 语言并扛起了电信级高可用("let it crash"哲学)。两者的关键差异:在 CSP 里,通道是第一公民,进程是匿名的;在 Actor 模型里,角色是有名字的,信箱是隐含的。这个差异决定了两个体系下解耦的方式不同——Go 里你持有的是“管子”,Erlang 里你持有的是“人”。Pike 选择 CSP 一脉,与 Go 的静态类型和简单性哲学一脉相承。

四、负载均衡器:让“加一只地鼠”真正落地

理论讲完,演讲的后半段用一个负载均衡器(balancer)的 Go 代码演示收尾:一个分发器通过通道把任务派给一组可复制的 worker,每个 worker 干完活通过通道汇报。关键镜头是——把 worker 复制一份,代码几乎一行不改,吞吐立刻扩展。

这个 demo 表面平淡,实则兑现了地鼠寓言的全部承诺,而且它背后站着 Go 运行时最硬核的工程事实:结构与执行的解耦在语言层面被强制执行了。你的 goroutine 是逻辑结构,至于多少只地鼠真正同时跑在几个核上,是调度器的事——开发者用 GOMAXPROCS 表达意愿,Go 运行时负责兑现。Go 1.1(2013 年)引入 Dmitry Vyukov 设计的 G-M-P 调度模型后,这种兑现效率又上了一个台阶:M(内核线程)与 P(逻辑处理器)分离,goroutine 在 P 的本地队列间偷任务,阻塞系统调用时 P 会被让渡给其他 M——这正是“一只地鼠装卸车时另一辆照推”的运行时实现。

把镜头拉远看,这套“复制即扩容”的认知后来成了整个行业的常识:Nginx 的多 worker、Kubernetes 的多副本、消息队列的消费组,全都是“结构已并发,扩容只加人”的变奏。而这场 2012 年的演讲,是这套常识最早也最有说服力的认知包装之一。

五、批判性审查:哪些站得住,哪些要打折

证据充分的部分:并发与并行的概念区分如今已是学界与工程界共识;CSP 有四十多年的形式化研究背书,不是拍脑袋的口号;goroutine 的栈成本、G-M-P 调度器都是可复现的工程事实。

需要打折的部分,恰恰是流传最广的那句口号:

  1. “靠通信共享内存”不是银弹。Go 自己就保留了 sync.Mutex、sync/atomic 全家桶,官方文档明确建议共享状态的热点路径用锁——因为 channel 操作的固定开销高于原子操作和无竞争锁,这是社区基准测试长期确认的事实。真实的高性能代码几乎都是通道与锁混用。
  2. 通道不能消灭竞态与死锁。channel 保证的是“交接原子性”,不保证“业务逻辑正确性”——两个 goroutine 先后向同一通道发两条消息的顺序依然是个逻辑竞态。更坑的是死锁:Go 运行时只对“所有 goroutine 都睡着”的全局死锁报 panic,局部死锁只是静默泄漏。正因为此,Go 官方后来推出了基于 ThreadSanitizer 的竞态检测器(go test -race,Go 官方博客有专文),这等于官方承认:语言结构挡不住人犯错。
  3. “加地鼠就翻倍”受 Amdahl 定律约束。Gene Amdahl 在 1967 年就给出上限:加速比被串行部分封死。地鼠寓言是理想流水线,现实系统里总有那一段推不动的串行地带。
  4. 这是一场布道,不是中立综述。硬件本身就是共享内存架构,Cilk、OpenMP 的 fork-join 世界证明了并行完全不需要消息传递。Pike 论证的是“这种结构更清晰”,而不是“这是唯一正道”。2012 年正是 Go 1.0 发布前夕的造势期,听过这场演讲再去看十年后 Java 21 虚拟线程(Project Loom,2023 年落地)的选择——它拥抱了“轻量执行流”,却坚持以共享内存语义为主——就更明白:并发结构革命的下半场,两大学派是合流而非取代。

六、认知提升与实用启示

第一条:把设计顺序倒过来——先画地鼠图,再写代码。 动手前回答三个问题:每块数据归谁所有(地鼠的职责边界)?它们之间走哪几条通道(独轮车的路线图)?哪里会出现等待(装卸车的阻塞点)?图画完,并行度是最后一行才填的参数——线程池大小、GOMAXPROCS、K8s 副本数,都属于“执行配置”,与结构无关。这样设计出的系统,从单机迁到百核集群不需要重构,只需要调参。

第二条:把阻塞当免费,用同步的风格写异步的逻辑。 “一辆车在装货就去推另一辆”的工程翻译是:在协程、虚拟线程、goroutine 这些载体上,阻塞调用不再昂贵,直接按直觉顺序写即可,切换交给运行时。这个习惯可以平移到 Java 21 虚拟线程、Kotlin 协程与 async/await 世界——告别回调地狱从来不是语法糖问题,而是结构红利问题。

第三条:认知上接受“结构正确不等于没有竞争”,给并发上双保险。 一,把 go test -race 写进 CI,让检测器替你抓竞态;二,上线前用 pprof 的 goroutine profile 查泄漏——记住局部死锁不报警,只有监控能救你。设计靠 CSP 思想,兜底靠工具链,两手都要硬。

视频论证结构图

flowchart TD
    A[核心命题:并发不等于并行] --> B[并发是结构<br/>应对多件事]
    A --> C[并行是执行<br/>同时做多件事]
    B --> D[地鼠寓言<br/>一鼠两车吞吐翻倍]
    C --> E[双鼠双车<br/>复制即扩容]
    D --> F[方法层:Go三件套]
    F --> G[goroutine轻量执行流]
    F --> H[channel类型化管道]
    G --> I[执行层:调度器管并行度]
    H --> I
    E --> J[结论:结构对了<br/>并行只是加人]
    I --> J

延伸阅读

  1. The Go Blog: Concurrency is not Parallelism — Go 官方博客为这场演讲发布的正式公告,Andrew Gerrand 撰写的配套要点,与视频互为最佳注脚。
  2. Hoare, C.A.R. (1978). Communicating Sequential Processes — 这场演讲全部思想的源头,CACM 原文。

参考来源

  1. Concurrency Is Not Parallelism — Heroku 官方频道 — 本文解读的视频本体(本轮环境无法实时抓页,URL 为长期稳定地址;播放量等动态数据未标注)
  2. The Go Blog: Concurrency is not Parallelism — 官方公告与演讲要点
  3. Communicating Sequential Processes, CACM 1978 — Hoare 原始论文,CSP 理论源头
  4. Herb Sutter: The Free Lunch Is Over (2005) — 多核危机的时代背景文献
  5. Introducing the Go Race Detector — The Go Blog — 批判性审查部分的官方工具佐证

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入