协程Coroutine
轻量级”线程“
非抢占式多任务处理,由协程主动交出控制权(如果程序中间没有print,程序会一直霸占着调度器)
编译器/解释器/虚拟机层面的多任务
多个协程可能在一个或多个线程上运行
goroutine可能的切换点
1.I/O,select
2.channel
3.等待锁
4.函数调用(有时)
5.runtime.Gosched()
package main import ( "fmt" "time" "runtime" ) func main() { var a [10]int for i:=0;i<10;i++{ go func(i int) { for { //fmt.Printf("hello from "+"gorounting %d ",i) a[i]++ runtime.Gosched() } }(i)//表示取之于外面的i } time.Sleep(time.Millisecond) fmt.Println(a) }
通道可以被显式的关闭;尽管它们和文件不同:不必每次都关闭。只有在当需要告诉接收者不会再提供新的值的时候,才需要关闭通道。只有发送者需要关闭通道,接收者永远不会需要。
从不同的并发执行的协程中获取值可以通过关键字select
来完成,它和switch
控制语句非常相似也被称作通信开关;它的行为像是“你准备好了吗”的轮询机制;select
监听进入通道的数据,也可以是用通道发送值的时候。
select { case u:= <- ch1: ... case v:= <- ch2: ... ... default: // no value ready to be received ... }