协程的简单操作,你都知道哪些?Golang如何实现协程交替打印?

2022-12-28 18:34:24 浏览数 (2)

前言

对于并发的概念,我们都清楚为了合理利用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()
}

创作不易,点个赞吧!

0 人点赞