golang 并发之goroutine

发布时间 2023-10-15 16:15:25作者: Jimmy-Guo

goroutine 的启动

  1. 将要并发执行的任务包装成一个函数,调用函数时候前面加上go 关键字,就能够开启goroutine去执行该函数的任务
  2.  goroutine对应的函数执行完成,该goroutine就结束
  3.  程序启动的时候自动的创建一个goroutine去执行main函数
  4. main函数结束之后那么程序就该结束了,由该程序的所有其他goroutine也都结束了。
func test(){
   fmt.Printfn("start test")  
}

func main(){
   go test()   
}

  

goroutine的本质

  1. goroutine的调度模型:
  2. GMP
  3. M:N   把m个goroutine分配给n个操作系统线程

goroutine与操作系统线程(os线程)的区别

  1. goroutine是用户态的线程 ,比内核态的线程更加轻量一点,初始时候只占用2kb的栈空间

 runtime.GOMAXPROCS

  1. runtime.GOMAXPROCS(1)  只占用1核cpu

sync.WaitGroup

var wg sync.WaitGroup
wg.Add(1)
wg.Done()
wg.Wait() 

 

  

channel 通道

  1. 通过channel实现多个goroutine 之间的通信
  2. channel:是一种类型 一种引用的类型 make 函数初始化之后才能使用(slice,map,channel)
  3. channel的声明: var ch chan
  4. channel初始化: b = make(chan 元素 [缓冲区大小]) 
  5. channel 的操作
    1. 发送:   ch1 <- 100 
    2.  接收:x := <- ch1
    3.   关闭:close(ch1)
  6. 待缓冲区的通道和不带缓冲区的通道
    1. a = make(chan int )         不带缓冲区的通道   
    2. b = make(chan int ,10 )   待缓冲区的通道 
  7. 单项通道,通常作为函数的参数
    1. 只读通道: <- chan int
    2. 只写通道:chan<- int