2023寒假参加字节跳动青训营时候的学习记录,报了后端基础班随便混混听几节课。
协程GoRoutine与Go语言的并发编程¶
本页统计信息
-
本页约 778 个字, 预计阅读时间 3 分钟。
-
本页总阅读量次
一些八股文¶
并发和并行的区别: - 并发是指多线程程序在一个CPU上运行 - 并行是在多个CPU上同时运行多个线程
线程和协程 - 协程:用户态,轻量级的线程,栈是MB级别的 - 线程:内核态,一个线程中有多个协程,栈的大小是KB级别的,创建和删除的系统开销比较大
GoRoutine的设计理念¶
GoRoutine是Go语言中的一种轻量级线程,提倡通过通信来共享内存,而不是通过共享内存来实现通信。如下图所示: GoRoutine在使用的时候直接用go func这样的形式就可以为一个函数创建一个GoRoutine并进行运行
Channel的用法¶
Channel可以用于实现GoRoutine之间的通信,是一种引用类型,需要用make关键字来进行创建,分为两种: - 无缓冲通道,没有缓冲空间,只能放下一条通信的消息 - 有缓冲通道,有一定的缓冲空间,需要在定义的时候声明
并发安全Lock¶
Go语言中其实也保留了通过共享内存来实现通信的方式,实际上就是锁,在sync.Mutex
中定义了互斥锁的数据结构可以使用。锁可以一定程度上解决并发安全的问题。
WaitGroup¶
相比于使用sleep来保证线程不会因为执行结束而被销毁,WaitGroup是一种优雅的实现方式,它实际上维护了一个计数器,并对外提供了三个可调用的方法,分别是:
- Add(delta int)
计数器增加delta
- Done()
计数器-1,在各种子线程中使用
- Wait()
阻塞直到计数器变成0
Go语言的依赖管理¶
我们在开发项目的时候,常需要使用已有的Go语言函数库/方法库,这就涉及到对其他包(依赖库)的引入和管理。Go语言的依赖管理主要经历了三个阶段,分别是Go Path,Go Vendor,Go Module
GoPath¶
GoPath是Go语言开发中的一个环境变量,这个路径对应了一个正在开发的Go语言项目,该路径下主要有三个目录: - bin,项目编译的二进制文件 - pkg,编译的中间产物 - src,是项目源代码所在的文件 但如果我们同事在开放两个Go项目需要依赖同一个库的不同版本,GoPath就会出现冲突
Go Module¶
Go Module是Go1.16之后的依赖管理方式,解决了Go Path和Go Vendor 可能会出现的版本冲突问题,它的目标是定义版本的规则和管理项目的依赖关系: - 整个项目用go.mod文件来声明项目所需的各种包 - 通过go get或者go mod指令来管理依赖的包