golang的协程和通道的分析

每个协程对应于每个并发的事件,程序可以不用协程,这样运行的效率不如用协程的要快。

同时运行的协程数,与cpu数进行匹配最合适,否则会出现deadlock。

协程间的通信,通过chan来实现,而多个chan可以组成管道,来顺序的传递数据。

<-在chan的左侧是用于输出,<-在chan的右侧是用于输入,在函数调用时可以通过<-来设置chan的读写权限。

写个demo如下:

package main
import (
	"fmt"
	"runtime"
)
const (
	cnt =2 //并发处理的数量
)
var vcnt int
func begin(id string, in chan<- string) {
	in<- fmt.Sprintf("set in chan  %s",id)
	fmt.Println("in begin, in chan ",id)
	vcnt++
	if vcnt >= cnt {
		close(in)
	}
}
func media(in <-chan string,out chan<- string) {
	for d:=range in {
		fmt.Println("in media "+d)
		out<-d
	}
	close(out)
}
func end(out <-chan string,done chan<- int) {
	for d:= range out {
		fmt.Println("in end "+d)
	}
	done<-1
	close(done)
}
func main() {
	maxProcs := runtime.NumCPU() //获取cpu个数
	runtime.GOMAXPROCS(maxProcs) //限制同时运行的goroutines数量
	vcnt=0
	in := make(chan string,cnt)
	out :=make(chan string)
	done :=make(chan int)
	for i:=0;i
在main函数中,首先对同时运行的协程数量进行限定。

三个chan中,in是输入chan,通过cnt个协程分别进行写入,对in设置cnt个缓冲区,保证能并发的写入

out是输出chan,在media中把in传递到out,在end中完成输出

done是标识chan,用来通知主函数,end协程运行完毕,可以退出了。用sync.WaitGroup是更加通用的做法。

另外,对于chan的close,是告知读入chan已完成,无新的数据读入了。


你可能感兴趣的:(go)