5、Goroutine(协程)

routine 协程

轻量级“线程”

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

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

多个协程可能在一个或多个线程上运行(线程数量一般不大于机器核数)

 

goroutine 并发栗子

func main()  {
    for i := 0; i < 1000; i++ {
        go func(j int) {
            //for {
                fmt.Println("i am routine",j)
          // runtime.Gosched() // 手动交出控制权 //} }(i) } time.Sleep(time.Millisecond) }

 

goroutine 可能会切换的点

解释:
任何函数加上go就能送到调度器运行
调度器会在合适的位置进行协程的切换

I/O,select

channel

等待锁

函数调用(有时)

runtime.Gosched()

 

检测数据访问冲突(检测race condition)

func main()  {
    a := 1
    for i := 0; i < 1000; i++ {
        go func(j int) { //race condition
            for {
                a++
            }
        }(i)
    }
    time.Sleep(time.Millisecond)
}

检测命令

go run -race test.go

 

上一篇:Google Earth Engine——USGS GAP Alaska 2001美国国家陆地生态系统数据代表了美国本土、阿拉斯加、夏威夷和波多黎各的详细植被和土地覆盖分类


下一篇:JavaSwing+mysql仿QQ聊天工具