Go语言进阶|青训营笔记

176 阅读1分钟

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

Go语言并发编程

基础概念

并发:类似多线程程序在一个核的cpu上运行,某一时刻只有一个线程被执行。线程间是交替执行的

并行:类似多线程程序在多核的cpu上运行,多个线程可同时运行在不同核心上

屏幕截图 2023-01-16 173331.png 线程:内核态,线程可运行多个协程,栈MB级别

协程:用户态,轻量级线程,栈KB级别

Goroutine即为协程,可使用go或go func(){}()开启一个协程
如:

go func(port string, rp *models.RepositoryPool) {
   server := &http.Server{
      Addr:         "127.0.0.1" + port,
      ReadTimeout:  2 * time.Second,
      WriteTimeout: 2 * time.Second,
   }
   mux := http.NewServeMux()
   mux.Handle("/", http.FileServer(http.Dir(define.ServerDownloadPath+"\"+rp.Name[:len(rp.Name)-len(rp.Ext)])))
   server.Handler = mux
   err = server.ListenAndServe()
   if err != nil {
      return
   }
   <-GetPort
}(port, rp)

Go语言实现Goroutine间通信的方式

Go语言有两种实现Goroutine间通信的方式:通道,临界区

通道(channel):概念类似进程间通信的管道(pipe)。线程可向通道中发送数据与信号也可从通道中接收数据与信号

var ToServerDone = make(chan string 2)
var ToServerDone = make(chan string)

通道的创建:make(chan 元素类型,[缓冲区大小]) 当缓冲区满后正在向该通道发送数据的Goroutine将会被阻塞。同理,当接收通道数据的Goroutine未接收到数据时也将处于阻塞状态直到接收到数据。可以通过该特性利用无缓冲区的通道实现Goroutine同步

临界区:与C++中的临界区概念类似,通过mutex,lock,WaitGroup实现Goroutine同步

Go依赖管理

GOPATH->Go Vendor->Go Module
现在普遍使用Go Module与Go get方式进行依赖管理

依赖管理三要素

配置文件,描述依赖 go.mod
中心仓库管理依赖库 Proxy
本地工具 go get/mod