10.1 goroutine

一、并发编程

  1. 简单案例

    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

  1. 轻量级"线程"

  2. 非抢占式多任务处理,由协程主动交出控制权

  3. 编译器/解释器/虚拟机层面的多任务

  4. 过个协程可以在一个或多个线程上运行

    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?