阅读量:0
1 两个channel 版本
package main import ("fmt" "sync") var wg sync.WaitGroup var c1 chan int var c2 chan int func A(){ defer wg.Done() for i:=0;i<10;i++ { <-c1 fmt.Println(2*i) c2<-1 //牵引协程 } } func B(){ defer wg.Done() for i:=0;i<10;i++ { <-c2 fmt.Println(2*i+1) c1<-1 } } func main () { wg = sync.WaitGroup{} //初始化 c1 = make(chan int, 1) //有缓存,不然会死锁 c2 = make(chan int) wg.Add(2) go A() //协程执行函数 go B() c1<-1 //启动协程 wg.Wait() fmt.Println("hello https://tool.lu/") }
无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。
这种类型的通道要求发送 goroutine 和接收 goroutine同时准备好,才能完成发送和接收操作。
如果都使用无缓冲通道,需要小修一下B()函数,避免死锁。
package main import ("fmt" "sync") var wg sync.WaitGroup var c1 chan int var c2 chan int func A(){ defer wg.Done() for i:=0;i<10;i++ { <-c1 fmt.Println(2*i) c2<-1 } } func B(){ defer wg.Done() for i:=0;i<10;i++ { <-c2 fmt.Println(2*i+1) if i < 9 { //临结束时候,不再写入 c1<-1 } } } func main () { wg = sync.WaitGroup{} c1 = make(chan int) c2 = make(chan int) wg.Add(2) go A() go B() c1<-1 wg.Wait() fmt.Println("hello https://tool.lu/") }
2 1个通道版本
- 奇偶打印条件过滤
- 管道自牵引
package main import ("fmt" "sync") var wg sync.WaitGroup var c1 chan int func A(){ defer wg.Done() for i:=0;i<10;i++ { <-c1 if i%2 == 0 { fmt.Println(i) } } } func B(){ defer wg.Done() for i:=0;i<10;i++ { c1<-1 if i%2 == 1 { fmt.Println(i) } } } func main () { wg = sync.WaitGroup{} c1 = make(chan int) wg.Add(2) go A() go B() wg.Wait() fmt.Println("hello https://tool.lu/") }
3 不使用 channel
package main import ("fmt" "sync") var wg sync.WaitGroup var i int func A(){ defer wg.Done() for ;i<10; { if i%2 == 0 { fmt.Println(i) i++ } } } func B(){ defer wg.Done() for ;i<10; { if i%2 == 1 { fmt.Println(i) i++ } } } func main () { wg = sync.WaitGroup{} i = 0 wg.Add(2) go A() go B() wg.Wait() fmt.Println("hello https://tool.lu/") }