goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心。goroutine使用方式很是的简单,只需使用go关键字便可启动一个协程,而且它是处于异步方式运行,你不须要等它运行完成之后在执行之后的代码。html
一、 主线程是一个物理线程,直接做用在 cpu 上的。是重量级的,很是耗费 cpu 资源。编程
二、 协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。安全
三、 Golang 的协程机制是重要的特色,能够轻松的开启上万个协程。其它编程语言的并发机制是通常基于线程的,开启过多的线程,资源耗费大,这里就突显 Golang 在并发上的优数据结构
四、goroutine经过go关键字实现了,其实就是一个普通的函数。并发
为了充分了利用多 cpu 的优点,在 Golang 程序中,设置运行的 cpu 数目(Go1.8之后默认运行在多核上)异步
num := runtime.NumCPU() //本地机器的逻辑CPU个数 runtime.GOMAXPROCS(num) //设置可同时执行的最大CPU数,并返回先前的设置 fmt.Println(num)
package main import ( "fmt" "time" ) func test(){ for i := 1;i <= 10;i++ { fmt.Println(i) time.Sleep(time.Second * 2 ) //睡眠2s } } func main(){ go test() //开启协程 for i := 1;i <= 10;i++ { fmt.Println("===============") time.Sleep(time.Second ) //睡眠1s } } #########结果###### =============== 1 =============== =============== 2 =============== 3 =============== =============== 4 =============== =============== 5 =============== =============== 6
计算0-10的乘阶编程语言
代码:函数
package main import ( "fmt" "sync" "time" ) var ( m = make(map[int]uint64) //lock是一个全局互斥锁 //sync.Mutex 是互斥锁 lock sync.Mutex //申明一个互斥锁 ) type task struct { n int } func calc(t *task) { defer func() { err := recover() if err != nil { fmt.Println("error...") return } }() var sum uint64 sum = 1 for i := 1; i < t.n; i++ { sum *= uint64(i) } lock.Lock() //加锁 m[t.n] = sum lock.Unlock() //解锁 } func main() { for i := 0; i <= 10; i++ { t := &task{n: i} go calc(t) // Goroutine来执行任务 } time.Sleep(time.Second) // Goroutine异步,因此等一秒到任务完成 lock.Lock() //读全局数据加锁 for k, v := range m { fmt.Printf("%d! = %v\n", k, v) } fmt.Println(len(m)) lock.Unlock() //解锁 } #########结果####### 10! = 362880 0! = 1 2! = 1 3! = 2 4! = 6 5! = 24 7! = 720 8! = 5040 1! = 1 6! = 120 9! = 40320 11
一、channle 本质就是一个数据结构-队列ui
二、数据是先进先出spa
三、线程安全,多 goroutine 访问时,不须要加锁,就是说 channel 自己就是线程安全的
四、channel 有类型的,一个 string 的 channel 只能存放 string 类型数
示意图:
文档参考:
http://www.cnblogs.com/wdliu/p/9272220.html
一、channel 中只能存放指定的数据类型
二、channle 的数据放满后,就不能再放入了
三、若是从 channel 取出数据后,能够继续放入
四、在没有使用协程的状况下,若是 channel 数据取完了,再取,就会报 dead lock