方法1
使用两个协程一个管道,一个协程输入,另一个协程接收,保证i在两个协程中的值一样。
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var ch1 chan int
var pool = 101
func main() {
ch1 = make(chan int)
wg.Add(2)
go func() {
print1()
}()
go func() {
print2()
}()
wg.Wait()
}
func print2() {
defer wg.Done()
for i := 1; i <= pool; i++ {
<-ch1
if i%2 == 0 {
fmt.Println("groutine-2:", i)
}
}
}
func print1() {
defer wg.Done()
for i := 1; i <= pool; i++ {
ch1 <- i
if i%2 == 1 {
fmt.Println("groutine-1:", i)
}
}
}
方法二
使用协程池,一个管道输入,一个管道输出
func main() {
a := 0
fn := func() int {
a++
return a
}
ch1 := make(chan int, 1)
ch2 := make(chan int, 3)
for i := 0; i < 3; i++ {
go func(j int) {
for {
ch1 <- 1
n := fn()
if n > 100 {
ch2 <- j
<-ch1
return
}
fmt.Println("go", j, ":", n)
<-ch1
}
}(i)
}
for i := 0; i < 3; i++ {
aa, ok := <-ch2
fmt.Println(aa, ":::", ok)
}
}