Go Concurrency
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 是一个返回通道的函数。
...Go 并发模式之 Context
Context 标准库
Go 并发编程:协程和通道
Go 协程和通道