zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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

Golang 实现 如何 操作 简单 哪些 知道 打印
2023-06-13 09:16:22 时间

前言

对于并发的概念,我们都清楚为了合理利用CPU的执行效率,我们选择当一个事务或多个事务执行时交替执行对于当下的计算机执行是很快的并且是对用户无感的,所以我们往往采用极少的资源执行更多事情。假设目前需要执行两个协程,一个协程来执行字母,一个协程执行数字,让两个协程进行交替打印如何实现?又或者如何使用大量的多个协程来交替的执行从一数到五万这样的大任务呢?

公共变量

对于下方的WaitGroup方法可以参考我之前写过的一篇文章:【并发编程】WaitGroup 基本用法和如何实现以及常见错误

之后加入一个关键信号量(boolean)来控制同步问题,当然你也可以使用golang的管道来实现。

wg := sync.WaitGroup{}
wg.Add(2)
boolean := true
num, str := 1, 'A'
// 协程块
// ......
wg.Wait()

协程打印数字

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
  }
 }
}()

所有代码

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()
}

创作不易,点个赞吧!