两个协程交替打印
题记:
请使用两个协程交替输出AaBbCcDdEeFf.....,要求协程1只能输出ABC......,协程2只能输出abc.....
实现逻辑(当一个协程打印了之后,发一个信号给到done,然后另一个阻塞的协程就接收到信号继续打印,一次类推)
自己实现了个代码,测试没问题,不知道是不是最优
代码如下:
package main
import (
"fmt"
"sync"
"time"
)
//两个goroutine,一个打印A,另一个打印a, 顺序打印AaBbCcDd.....
var wg sync.WaitGroup
func worker1(ch chan struct{},data chan string) {
fmt.Println("worker 1")
defer wg.Done()
for{
select {
case <-ch:
tmp :=<- data
time.Sleep(time.Second*1)
fmt.Println("big:",tmp)
ch <- struct{}{} //发送信号
default:
}
}
}
func worker2(ch chan struct{},data chan string) {
fmt.Println("worker 2")
defer wg.Done()
ch<- struct{}{} // 先发送信号给协程1
for{
select {
case <-ch:
tmp :=<- data
time.Sleep(time.Second*1)
fmt.Println("small:",tmp)
ch <- struct{}{} //发送信号
default:
}
}
}
func main() {
done := make(chan struct{})
dataChan :=make(chan string)
wg.Add(1)
go func() {
defer wg.Done()
s1 := []string{"A","a","B","b","C","c","D","d","E","e","F","f"}
for _,v := range s1 {
dataChan <- v //一个阻塞的channel,数据源
}
//for i :=0;i<100;i++{
// dataChan <- strconv.Itoa(i)+"_test"
//}
}()
wg.Add(2)
go worker1(done,dataChan)
go worker2(done,dataChan)
wg.Wait()
}

浙公网安备 33010602011771号