GO语言上手-工程实践|青训营笔记

80 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第去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