前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >协程的简单操作,你都知道哪些?Golang如何实现协程交替打印?

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

作者头像
了凡银河系
发布2022-12-28 18:34:24
5930
发布2022-12-28 18:34:24
举报
文章被收录于专栏:了凡的专栏

前言

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

创作不易,点个赞吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 了凡银河系 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 公共变量
  • 协程打印数字
  • 协程打印字母
  • 所有代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档