这是我参与「第五届青训营 」笔记创作活动的第3天
1、并发与并行
- 并发: 多线程程序在一个核的cpu上运行
- 并行: 多线程程序在多个核的cpu上运行
- go可以充分利用多核优势,高效运行
2、线程和协程
- 协程: 用户态,轻量级线程,栈MB级别
- 线程: 内核态,线程跑多个协程,栈KB级别。
- 在go语言,在语句前面加go就可以创建携程。
3、Channel
- 代码:make(chan 元素类型,[缓冲大小])
- 功能:在运行时留有缓存空间
- 场景:在进行生产和消费时中可以使用
4、Lock
var{
x int64
lock sync.Mutex
}
func addWithLock() {
for i := 0; i < 2000; i+ {
Tock.LockO//加锁
X += 1
lock.Unlock()//解锁
func addWithoutLock() {
for i := 日; i < 2000; i+ {
X += 1
}
}
示例中使用多个协程运行,若没加锁输出的结果是未知的
5、WaitGroup
func main() {
var waitGroup sync.WaitGroup
start := time.Now()
waitGroup.Add(5)
for i := 0; i < 5; i++ {
go func() {
defer waitGroup.Done()
time.Sleep(time.Second)
fmt.Println("done")
}()
}
waitGroup.Wait()
fmt.Println(time.Now().Sub(start).Seconds())
}
/*
done
done
done
done
done
1.000306089
*/
示例中使用 Add(5) 表示我们有 5个 子任务,然后起了 5个 协程去完成任务,主协程使用 Wait() 方法等待 子协程执行完毕,输出一共等待的时间。