协程的简单操作,你都知道哪些?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()
}
创作不易,点个赞吧!
相关文章
- 使用Golang实现PHP的Addslashes和Stripslashes「建议收藏」
- golang操作elasticsearch详解[通俗易懂]
- Golang的垃圾回收
- 堆的Golang实现
- Golang栈内存不足逃逸分析
- 在Golang中使用Kafka实现消息队列
- 快速选择算法Golang实现
- 在线客服系统源码开发实战总结:Golang实现CMS内容管理增删查改功能
- Golang面向对象中易混淆的几个概念
- Golang实现默克尔树(merkle tree)
- Golang Project: Tic Tac Toe
- vscode golang环境搭建「建议收藏」
- Golang开发环境搭建(Windows)[通俗易懂]
- golang封装http get函数请求并且携带header头信息
- golang源码分析:单测和集成测试覆盖率实现原理(1)
- golang源码分析:goc集成测试覆盖率实现原理(2)
- golang select实现原理
- Golang的继承和多态实现
- RSS Can:使用 Golang 实现更好的 RSS Hub 服务(一)
- Golang语言情怀--第98期 区块链技术-以太坊公链合约部署-第4节:MetaMask钱包连接到本地环境
- 造一个golang轮子:实现nacos sidecar服务自动注册
- 在线客服系统的源码中Golang Gin框架实现IP白名单机制
- Golang如何实现节假日不打扰用户?
- golang中time包使用教程之基础使用篇
- Golang-绕不开的数组和切片总结
- Golang实现线程安全的懒汉式单例模式
- Golang channel 用法与实现原理
- 2023-03-09:用golang调用ffmpeg,将流媒体数据(以RTMP为例)保存成本地文件(以flv为例)。
- 2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件。
- 数据结构【Golang实现】(一)——单链表
- 数据结构【Golang实现】(四)——双向循环链表
- 批量上传GPT知识库,前端elementui的upload上传组件,后端Golang的上传接口实现
- 基于golang+lua虚拟机的日志分析系统实现
- Golang 1.17, LLVM 13被批准在Fedora 35使用
- Golang实现的聊天程序服务端和客户端代码分享