前言
对于并发的概念,我们都清楚为了合理利用CPU的执行效率,我们选择当一个事务或多个事务执行时交替执行对于当下的计算机执行是很快的并且是对用户无感的,所以我们往往采用极少的资源执行更多事情。假设目前需要执行两个协程,一个协程来执行字母,一个协程执行数字,让两个协程进行交替打印如何实现?又或者如何使用大量的多个协程来交替的执行从一数到五万这样的大任务呢?
公共变量
对于下方的WaitGroup方法可以参考我之前写过的一篇文章:【并发编程】WaitGroup 基本用法和如何实现以及常见错误
之后加入一个关键信号量(boolean)来控制同步问题,当然你也可以使用golang的管道来实现。
代码语言:javascript复制wg := sync.WaitGroup{}
wg.Add(2)
boolean := true
num, str := 1, 'A'
// 协程块
// ......
wg.Wait()
协程打印数字
代码语言:javascript复制go func() {
defer wg.Done()
for {
if boolean {
fmt.Print(num)
num
fmt.Print(num)
num
boolean = false
}
if num > 28 {
break
}
}
}()
协程打印字母
代码语言:javascript复制go func() {
defer wg.Done()
for {
if !boolean {
fmt.Print(string(str))
str
fmt.Print(string(str))
str
boolean = true
}
if str > 'Z' {
break
}
}
}()
所有代码
代码语言:javascript复制package main
import (
"fmt"
"sync"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(2)
boolean := true
num, str := 1, 'A'
// 打印数字
go func() {
defer wg.Done()
for {
if boolean {
fmt.Print(num)
num
fmt.Print(num)
num
boolean = false
}
if num > 28 {
break
}
}
}()
// 打印字符
go func() {
defer wg.Done()
for {
if !boolean {
fmt.Print(string(str))
str
fmt.Print(string(str))
str
boolean = true
}
if str > 'Z' {
break
}
}
}()
wg.Wait()
}
创作不易,点个赞吧!