go-协程

go协程

1、在go中,协程包含了线程和协程

2、go中自动调度协程或线程来执行程序,能够充分利用多核优势,实现并发多线程

3、使用关键字go开启go协程

示例

func main() {
	for i:=0;i<10000;i++{
		go test()
	}

	time.Sleep(3*time.Second)
}

func test(){
	time.Sleep(2*time.Second)
	fmt.Println("测试go协程")
}

go协程间通信

信道:channel

信道是引用类型,零值为nil

go中,往信道中放数据和取数据都是阻塞机制,即放数据的时候,若放不进去,就会阻塞住,知道可以放进去;取数据也是一样,当取数据的时候,若取不到数据,就会阻塞住,直到可以取到数据

需要注意的是,这种阻塞态不会一直存在,当可以肯定一直放不进去或者取不到的时候,程序会抛出错误deadlock

无缓存信道

信道中不能缓存数据,往信道中放了数据,就必须有取数据的

// 引用类型数据,必须初始化才能使用
var c chan int = make(chan int)  // 只能传输int类型的数据

var c chan interface{} = make(chan interface{})  // 可以传输任意类型的数据

可缓存信道

信道中可以存放一定量的数据

已经存放的数据个数叫做信道长度

可存放的最大数据个数叫做信道容量

// 信道容量为5的,可传输任意类型数据的信道
var c chan interface{} = make(chan interface{}, 5)

// 信道容量为5的,只能传输int数据的信道
var c chan int = make(chan int, 5)

示例

func main() {
	var c chan interface{} = make(chan interface{}, 5)
	go test1(c)
	go test2(c)
	go test2(c)
	go test2(c)
	time.Sleep(1*time.Second)
}

func test1(c chan interface{}){
	c<-10
	c<-"hello"
	c<-"world"
	c<-[]int{1,2,3}
}

func test2(c chan interface{}){
	v := <-c
	fmt.Printf("测试管道:获取数据%v", v)
}
posted @ 2020-03-28 10:31  DongDon  阅读(174)  评论(0)    收藏  举报