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

  

 

posted @ 2018-12-08 11:55  __Miracle  阅读(124)  评论(0编辑  收藏  举报