我祭出毕生所学,讲讲并发编程:Go语言与JS双重切入

291 阅读3分钟

起因

想写这个主题很多年了,但是一直觉得自己功力不够,不足以把这么大一个主题讲通透。又加上并发编程不同于普通算法课、具体技术栈课,每个编程语言的具体处理方法、API都不同。所以这是一个对新手不友好的编程话题。但是,这又是成为编程高手的必经之路。

市面上、网络上关于这个话题的系统性学习材料并不多,不然就局限于某个具体语言来讲。近几年Go语言的流行让这个话题更大众了,但是我作为Go工程师,这2年面试求职者时,没有任何一个人真的把并发编程搞明白了。所以我觉得有必要给大家一个优质的、系统性的、理论和实践结合并且注重实践的、多技术栈横向对比的、并发编程教程。

我会着重以Go语言和JavaScript来作为教程的主体,因为这是我最熟悉的语言,也是Web和云计算绕不开的语言。有时可能会横向对比Python、Rust或者函数式语言,让大家有一个更全面的理解,而不是局限于某一个具体语言的具体编程接口。

本教程适合编程经验超过5000小时的同学。对于初级JS或Go语言工程师非常有帮助。

什么是并发编程

我们可以从很多角度去定义并发编程。这里我们不做学术性的严谨定义。

英文里有三个词表达相关意思:Parallel、Concurrent、Asynchronous

前两个词一般翻译为并发,最后一个翻译为异步。而如果要细分,Parellel可以翻译为并行。Concurrent才是并发。并行强调同时进行(时间段),并发强调同时发生(时间点)。

一般来讲,在硬件层面或者说程序抽象层面同时发生的运算,我们称其为Parallel。而N个各自独立的程序以自己的速度、步调进行运算,然后在特殊的时间点交换信息,我们称之为Asynchronous。Concurrent在不同的语境下可以指代任何一个。

所以本文会将 Concurrent 解释为 Parallel 和 Asynchronous 的并集。

但是以上定义都是从程序运算的状态去解释的。市面上的大多数教程都忽视了从软件架构的角度去诠释并发编程。

能够解耦的代码都可以并发!

这是贯穿全文的中心思想。

并发意味着不同代码块可以独立运行,从而产生一种终极的解耦状态。以并发设计为基础产生的解耦,比通过OOP的巧妙多态来解耦更彻底。

所以本质上,并发是一种设计理念,是一种划分程序内部边界的工具。

希望你细细品味这句话。下一篇文章我们会探讨最简单的一个并发问题:数据并行。