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() }