这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
Go语言并发编程
基础概念
并发:类似多线程程序在一个核的cpu上运行,某一时刻只有一个线程被执行。线程间是交替执行的
并行:类似多线程程序在多核的cpu上运行,多个线程可同时运行在不同核心上
线程:内核态,线程可运行多个协程,栈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