Go语言进阶-并发 | 青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

1. 写在前面

昨天的课用了半小时就把之前花了几天看的基础语法过了一遍,打了我一个措手不及,后面又跟了两个小实践,花了不少时间去消化。到了今天终于适应了一些节奏,本篇文章主要记录学习到的并发相关的内容。

2. 知识点

2.1 并发

并发是大家都熟悉的概念,是指通过在微观进行时间片的切换,让多个线程在宏观上达到同时运行的效果。而相对而言的并行,指的是真正的同时处理不同的事。

2.2 协程

协程是一种用户态的轻量级线程,运行在用户态,栈是MB级别;而一般线程则是运行在内核态,栈是KB级别的。
与多线程相比,协程的执行效率极高。这是由于子程序由程序自身控制,没有线程切换造成的额外开销。Golang通过使用协程来实现高性能并发。

2.3 Channel

channel是Goroutines通信的管道,数据单向流通,分为有缓冲通道和无缓冲通道。使用无缓冲通道时,会实现同步效果,固其也被称为同步通道;而有缓冲通道,则类似于一个生产者-消费者模型,缓存用于存放消费者来不及消费的信息。

2.4 并发安全

Golang除了使用通道进行通信,也可以通过共享内存进行通信。这个时候就需要考虑临界问题,即多个线程对同一临界区进行操作会出现的冲突。这个时候可以通过lock来对临界区进行控制,类似于信号量的互斥机制。相应的,Golang也有waitgroup来实现同步机制。

3. 其他

今天的授课主要还是偏向于在考虑大项目时会遇到的问题。虽然说是干货满满,但是由于缺乏相关经历,只达到一个知其然的效果,希望在之后的学习中我可以将其运用于实践。