这是我参与「第三届青训营 -后端场」笔记创作活动的的第去1篇笔记
1.1Goroutine协程:
协程与线程的区别
1)协程:用户态,一个线程可运行多个协程,单个内存大小kb级别
go协程的设计:
几个特点:复用线程,利用cpu并行,抢占,全局带锁的队列
由一个协程调度器去绑定一个线程,避免了cpu的上下文切换
每个协程调度器有一个工作队列,以出队的方式去处理goroutine
全局带锁的队列,多个协程调度器共同使用
两个机制:
窃取机制:当某个协程调度器中的工作队列没有待处理的goroutine,会去从队尾窃取goroutine,从而压榨cpu的资源
切换机制:当某个协程调度器当前正在运行中的goroutine阻塞住了,那它所对应的协程调度器会去开另一个新的线程进行绑定执行,把原来阻塞的goruotine同线程一起阻塞在那里,让cpu跟随切换。提高cpu的利用率。
2)线程:内核态,需要由cpu去调度,单个内存大小mb级别,需要cpu上下文切换去实现并发操作
1.2协程中的通信(CSP)
1)通过通信共享内存channel
2)通过共享内存(加锁)sync.Mutex 实现通信
1.3Channel
make(chan 元素类型,[缓存大小])
1)无缓冲通道 make(chan int)
当通道中有数据,其他goroutine会阻塞住,直到通道中的数据被消费
2)有缓冲通道 make(chan int ,2)
当通道中的队列满了其他goroutine才会阻塞住。
1.4WaitGroup (类似java中的CountDownLatch)
用途:用于一个协程去等待其他几个协程并发执行完后再执行
API:Add(int )初始化计数器大小
Done() 计数器减1
Wait()协程阻塞直到计数器为0