goroutine 的启动
- 将要并发执行的任务包装成一个函数,调用函数时候前面加上go 关键字,就能够开启goroutine去执行该函数的任务
- goroutine对应的函数执行完成,该goroutine就结束
- 程序启动的时候自动的创建一个goroutine去执行main函数
- main函数结束之后那么程序就该结束了,由该程序的所有其他goroutine也都结束了。
func test(){ fmt.Printfn("start test") } func main(){ go test() }
goroutine的本质
- goroutine的调度模型:
- GMP
- M:N 把m个goroutine分配给n个操作系统线程
goroutine与操作系统线程(os线程)的区别
- goroutine是用户态的线程 ,比内核态的线程更加轻量一点,初始时候只占用2kb的栈空间
runtime.GOMAXPROCS
- runtime.GOMAXPROCS(1) 只占用1核cpu
sync.WaitGroup
var wg sync.WaitGroup wg.Add(1) wg.Done() wg.Wait()
channel 通道
- 通过channel实现多个goroutine 之间的通信
- channel:是一种类型 一种引用的类型 make 函数初始化之后才能使用(slice,map,channel)
- channel的声明: var ch chan
- channel初始化: b = make(chan 元素 [缓冲区大小])
- channel 的操作
- 发送: ch1 <- 100
- 接收:x := <- ch1
- 关闭:close(ch1)
- 待缓冲区的通道和不带缓冲区的通道
- a = make(chan int ) 不带缓冲区的通道
- b = make(chan int ,10 ) 待缓冲区的通道
- 单项通道,通常作为函数的参数
- 只读通道: <- chan int
- 只写通道:chan<- int
标签:goroutine,chan,golang,并发,线程,缓冲区,channel,通道 From: https://www.cnblogs.com/zhenhui/p/17765657.html