图:使用无缓冲的通道在 goroutine 之间同步
// 这个示例程序展示如何用无缓冲的通道来模拟 // 2 个goroutine 间的网球比赛 package main import ( "fmt" "math/rand" "sync" "time" ) // wg 用来等待程序结束 var wg sync.WaitGroup func init() { rand.Seed(time.Now().UnixNano()) } // main 是所有Go 程序的入口 func main() { // 创建一个无缓冲的通道 court := make(chan int) // 计数加 2,表示要等待两个goroutine wg.Add(2) // 启动两个选手 go player("Nadal", court) go player("Djokovic", court) // 发球 court <- 1 // 等待游戏结束 wg.Wait() } // player 模拟一个选手在打网球 func player(name string, court chan int) { // 在函数退出时调用Done 来通知main 函数工作已经完成 defer wg.Done() for { // 等待球被击打过来 ball, ok := <-court if !ok { // 如果通道被关闭,我们就赢了 fmt.Printf("Player %s Won\n", name) return } // 选随机数,然后用这个数来判断我们是否丢球 n := rand.Intn(100) if n%13 == 0 { fmt.Printf("Player %s Missed\n", name) // 关闭通道,表示我们输了 close(court) return } // 显示击球数,并将击球数加1 fmt.Printf("Player %s Hit %d\n", name, ball) ball++ // 将球打向对手 court <- ball } }运行这个程序,输出结果如下所示。
Player Nadal Hit 1
Player Djokovic Hit 2
Player Nadal Hit 3
Player Djokovic Missed
Player Nadal Won
// 这个示例程序展示如何用无缓冲的通道来模拟 // 4 个goroutine 间的接力比赛 package main import ( "fmt" "sync" "time" ) // wg 用来等待程序结束 var wg sync.WaitGroup // main 是所有Go 程序的入口 func main() { // 创建一个无缓冲的通道 baton := make(chan int) // 为最后一位跑步者将计数加1 wg.Add(1) // 第一位跑步者持有接力棒 go Runner(baton) // 开始比赛 baton <- 1 // 等待比赛结束 wg.Wait() } // Runner 模拟接力比赛中的一位跑步者 func Runner(baton chan int) { var newRunner int // 等待接力棒 runner := <-baton // 开始绕着跑道跑步 fmt.Printf("Runner %d Running With Baton\n", runner) // 创建下一位跑步者 if runner != 4 { newRunner = runner + 1 fmt.Printf("Runner %d To The Line\n", newRunner) go Runner(baton) } // 围绕跑道跑 time.Sleep(100 * time.Millisecond) // 比赛结束了吗? if runner == 4 { fmt.Printf("Runner %d Finished, Race Over\n", runner) wg.Done() return } // 将接力棒交给下一位跑步者 fmt.Printf("Runner %d Exchange With Runner %d\n", runner, newRunner) baton <- newRunner }运行这个程序,输出结果如下所示。
Runner 1 Running With Baton
Runner 1 To The Line
Runner 1 Exchange With Runner 2
Runner 2 Running With Baton
Runner 2 To The Line
Runner 2 Exchange With Runner 3
Runner 3 Running With Baton
Runner 3 To The Line
Runner 3 Exchange With Runner 4
Runner 4 Running With Baton
Runner 4 Finished, Race Over
本文链接:http://task.lmcjl.com/news/14365.html