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....