概念
- Concurrency is not parallelism: 并发不等于并行
- channel有不同种类的类型 <-, ->箭头指明了channel的方向
- channel的buffer size表明了channel是同步channel还是异步channel
- CAS: compare-and-swap: 在设计并发算法是用到了CAS技术,提高了多线程执行的安全性
CAS
CAS原理: CAS有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false。
CAS操作是由操作系统提供相应的接口,并且在硬件层面提供支持
1
2
3
4
5if *addr == old {
*addr = new
return true
}
return falseCAS golang实现锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import (
"sync/atomic"
)
type Mutex struct {
state int32
}
func (m *Mutex) Lock() {
for(!atomic.CompareAndSwapInt32(&m.state, 0, 1)) {
return
}
}
func (m *Mutex) Unlock() {
atomic.CompareAndSwapInt32(&m.state, 1, 0)
}基于CAS实现sync.Map: goroutine 线程安全
初级
生成器(generator)
channel 在golang中和基本变量如int,string类型一样是第一级别的类型,生成器即函数返回一个channel,函数内部给channel添加东西。
生成器模式最为常用,可以用来实现最简单的生产者消费者模式,或者订阅发布模式。
1 | func boring(msg string) <-chan string { // Returns receive-only channel of strings. |
复用channel(select)
1 | func main() { |
控制并发(WaitGroup->chan->context)
WaitGroup
waitGroup为基础控制并发的类
1 | func main() { |
Context
context有如下4个函数用来由上级父context衍生新的context。
1 | func WithCancel(parent Context) (ctx Context, cancel CancelFunc) |
- WithCancel:返回ctx和取消函数
- WithDeadline:返回ctx和取消函数,当时间超过deadline时自动取消
- WithTimeout:和WithDeadline类似,不过是超时时间
- WithValue:传递元数据,通过ctx.Value(key)的方式获得数据
context即上下文,如下代码为构造一个,带取消函数的context, 即执行取消方法之后,watch函数响应退出。
context通常用来处理request请求的每个goroutine。
1 | func main() { |
worker调度
基础的worker队列调度方式
1 | idleWorker<-workerQueue |