func main(){
//协程并发计算的列子同步计算
//10000个数如果是偶数/2+1,如果是奇数*2
write:=make(chan int ,100)
read:=make(chan int ,200)
singal:=make(chan bool,5) //5个信号灯为true代表5个协程都计算完毕了
//开启一个协程写入要计算的数据
go putChan(write)
//开启5个协程计算
for i:=0;i<5;i++{
go compulate(write,read,singal)
}
//main函数中读取ch3如果读取到了代表计算完成了,应该关闭ch2
for i:=0;i<5;i++{
res:=<-singal //代码在这里报错了all goroutines are asleep - deadlock!
fmt.Println("读取到的ch3的数据是",res)
}
close(singal)
close(read) //关闭read
//打印结果
for v:=range read{
fmt.Println(v)
}
}
//一个write写入数据
func putChan(ch chan int ){
for i:=0;i<10000;i++{
ch<-i+1
}
//放完之后关闭
close(ch)
}
//计算 偶数/2+1 奇数*2
func compulate(write chan int,read chan int ,single chan bool){
//当前线程一直循环从chan冲读取数据
for{
res,ok:=<-write
if !ok{
break
}
if res%2==0{
read<-res/2+1
}else{
read<-res*2
}
}
//这个ch2能不能关闭-->关闭之后就不能再往里面写数据了,如果还有其他的协程在计算
fmt.Println("有一个协程计算完毕了")
single<-true
}
有疑问加站长微信联系(非本文作者))