golang中的goroutine

1. 概念

go中可以并发执行的活动单元称为goroutine
当一个go程序启动时,一个执行main function的goroutine会被创建,称为main goroutine
go func() 使用go语句开启一个新的goroutine之后,go语句之后的函数调用将在新的goroutine中执行, 并且不会阻塞当前程序的运行
goroutine是实际并发的实体,两个实体之间通过channel来实现数据的共享
goroutine底层是使用coroutine实现并发,
golang使用goroutine做为最小的执行单位,这个执行单位还是在用户空间,实际最后被处理器执行的还是内核中的线程
goroutine本质上是协程,不受内核调度,由go的调度器来调度

2. goroutine是异步执行,就有可能导致主程序执行完退出时还有goroutine还没有执行完,此时goroutine也会跟着退出
此时如果想等到所有goroutine任务执行完毕才退出,go提供了sync包解决同步问题
package main

import (
	"fmt"
	"sync"
	"time"
)

func add(n1, n2 int, g *sync.WaitGroup) {
	time.Sleep(time.Second)
	fmt.Println(n1 + n2)
	defer g.Done() // goroutine完成后,WaitGroup的计数-1
}

func main() {
	var goSync sync.WaitGroup
	goSync.Add(1) // WaitGroup的计数+1
	go add(11, 22, &goSync)
	goSync.Wait() // 等待所有goroutine执行完毕
	fmt.Println("结束了")
}

 channel 也可以解决同步问题

package main

import "time"

func worker(c chan bool) {
	time.Sleep(time.Second * 2)
	c <- true
}

func main() {
	done := make(chan bool)
	go worker(done)
	<-done  // 等待接收通道中的数据
}

  

 

posted @ 2021-10-13 15:24  专职  阅读(636)  评论(0编辑  收藏  举报