本视频中,Rob Pike 解释了并发与并行之间常被混淆的区别,强调并发是关于如何构造程序以同时处理多项任务,而并行是关于同时执行多项任务的能力。
Rob Pike 指出,虽然当今的编程语言似乎以面向对象为主,但现实世界本质上是并行的。从多核机器到网络再到用户交互,一切都在同时发生。然而,我们现有的计算工具在表达这种并行世界观方面并不理想。要解决这个问题,我们需要理解并发及其应用。
Rob Pike 通过一个生动的地鼠(Gopher)搬运旧 C++ 手册到焚化炉的例子,来阐述并发与并行的概念及其在系统设计中的应用。
Go语言提供了一系列内置的并发原语,使得并发编程变得简单且高效。
go 关键字即可启动一个 goroutine,使其在后台独立运行。channel <- valuevalue <- channelselect 语句允许 goroutine 同时监听多个通道,根据哪个通道准备好通信来执行不同的代码块。case 就绪来执行相应的操作。default 子句:如果所有通道都未就绪,则执行 default 块,实现非阻塞行为。switch 语句,但用于通信。Rob Pike 接着通过几个 Go 语言的实际代码示例,展示了如何利用 Go 语言的并发特性来解决现实世界的编程问题。
go func() 结合闭包创建一个 goroutine,在后台循环读取输入通道并写入输出通道。for range 循环可以自动遍历通道,当通道关闭且耗尽时自动退出。Work 结构,包含要处理的整数值。chan Work),发送输出通道(chan Result)。
func() 类型,表示要执行的计算。chan interface{} 类型,用于向请求者返回结果。
done 通道,用于工人完成任务后通知负载均衡器。select 循环:done 通道接收通知,减少该工人负载,更新其在堆中的位置。
Rob Pike 再次强调:并发性不是并行性,但它能实现并行性,并且让并行性变得简单。