Programming Languages
Go Mutex 原理
Go 并发模型和常见并发模式
并发与并行:
- 并发(concurrency)是独立执行的运算的组合,是一种组织软件代码的模式;
- 并发更多考虑的是代码结构,它的目标是产出简洁的代码(clean code);
- 并行(parallelism)是指同时执行多项任务;
- 并行更多的是关于代码的执行方式(多实例)。
Do not communicate by sharing memory; instead, share memory by communicating.
Go 始终推荐以 CSP (Communicating Sequential Process) 模型的风格构建并发程序。
select
语句是一种专属于并发的控制结构(control structure),它是把通道和协程这两个并发元素作为 Go 语言原生特性而不是一个库函数的的原因。用 select
可以轻易地实现控制结构,而用外部库函数则很难。
fan-in/fan-out:
- fan-in 负责任务汇总,一个协程从多个通道中读取数据并 multiplex 到一个通道,直到所有输入源关闭为止。
- fan-out 负责任务分发,多个协程去同一个通道读取数据,起到在多个 worker 中分配任务、使 CPU 和 I/O 并行化的作用。
- 协程去 fan-in 后的通道获取任务。
TL;DR
在循环中开启协程要特别注意是否需要使用闭包。
通知+等待:
g1
通知g2
结束并等待g2
结束后再结束:g1
往ch1
写数据通知,等待读ch2
成功后再退出;g2
读到ch1
后结束工作、执行 cleanup,最后写ch2
。- 一个协程等待多个子协程结束:子协程启动时
wg.Add(1)
并defer wg.Done()
;主协程wg.Wait()
。
generator 模式
generator 是一个返回通道的函数。
...