go_goroutine and channel

协程Coroutine

轻量级”线程“

非抢占式多任务处理,由协程主动交出控制权(如果程序中间没有print,程序会一直霸占着调度器)

编译器/解释器/虚拟机层面的多任务

多个协程可能在一个或多个线程上运行

goroutine可能的切换点

1.I/O,select

2.channel

3.等待锁

4.函数调用(有时)

5.runtime.Gosched()

go_goroutine and channel

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
        ...
}