10.1 goroutine
一、并发编程
简单案例
func main() { for i := 0; i < 1000; i++ { go func(i int) { // 传入参数 for { fmt.Printf("out put: %d\n", i) } }(i) // 具体传值 } time.Sleep(time.Millisecond) }
二、协程Coroutine
Coroutine轻量级"线程"
非抢占式多任务处理,由协程主动交出控制权
编译器/解释器/虚拟机层面的多任务
过个协程可以在一个或多个线程上运行
func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { // 传入参数 (防止访问冲突) for { a[i]++ // 手动交出控制权 runtime.Gosched() } }(i) // 具体传值(防止访问冲突) } time.Sleep(time.Millisecond) fmt.Println(a) }注意:
没有手动交出控制权的时候:go 1.14版本之后不会出现死机情况,go官方优化了
如果不传入
i那么会造成数据访问冲突
Last updated
Was this helpful?