Go之路(二十四):Goroutine
Goroutine
Go语言的核心,就是Goroutine
先说说线程和协程的关系,为什么Go能比较好的处理高并发呢
因为go起的是协程,协程是微量级的线程,不同于java等其他语言起的是重量级的线程,是内核态的
go是用户态的,可以由用户自己分配,所以起成千上万个协程也是比较轻松的

go是这样处理协程的,Mo 和M1是线程,P是上下文管理器,G代表协程,协程是队列模式,当处理G0的时候,后面的会拍成队列等待处理,当G0有io操作时,内部会再起一个线程,也就是M1来处理剩下等待的协程,这样子CPU的利用率就很高了。
另外,可以设置cpu的核数

例子:1000个协程求每个数的阶乘
package main
import(
"fmt"
"time"
"sync"
)
var test_map map[int]int = make(map[int]int)
var lock sync.Mutex
func task(n int){
var result = 1
for i:=1;i<n;i++{
result *= i
}
lock.Lock()
test_map[n] = result
lock.Unlock()
}
func main() {
for i :=0;i<1000;i++{
go task(i)
}
time.Sleep(time.Second*10)
lock.Lock()
for k,v := range test_map{
fmt.Printf("%d:%d\n",k,v)
}
lock.Unlock()
}

浙公网安备 33010602011771号