golang goroutine顺序输出方式


Posted in Golang onApril 29, 2021

range字符串,使用goroutine打印

因为goroutine随机执行

for _, v := range str {
        go func() {
            fmt.Println(string(v))
        }()
}

输出:

5

5

5

5

5

可以使用chan顺序输出

for  _, c := range str{
        ch := make(chan rune)
        go func(ch <-chan rune) {
            key := <-ch
            fmt.Println(string(key))
        }(ch)
        ch <- c
    }

输出:

1

2

3

4

5

补充:golang goroutine顺序循环打印ABC

分别使用sync.WaitGroup和context

使用sync.WaitGroup, 可控制循环次数

package main
import (
	"fmt"
	"sync"
)
//控制循环次数
var count = 5
func main() {
	wg := sync.WaitGroup{}
	chanA := make(chan struct{}, 1)
	chanB := make(chan struct{}, 1)
	chanC := make(chan struct{}, 1)
	chanA <- struct{}{}
	wg.Add(3)
	go printA(&wg, chanA, chanB)
	go printB(&wg, chanB, chanC)
	go printC(&wg, chanC, chanA)
	wg.Wait()
}
func printA(wg *sync.WaitGroup, chanA, chanB chan struct{}) {
	defer wg.Done()
	for i := 0; i < count; i++ {
		<-chanA
		fmt.Println("A")
		chanB <- struct{}{}
	}
}
func printB(wg *sync.WaitGroup, chanB, chanC chan struct{}) {
	defer wg.Done()
	for i := 0; i < count; i++ {
		<-chanB
		fmt.Println("B")
		chanC <- struct{}{}
	}
}
func printC(wg *sync.WaitGroup, chanC, chanA chan struct{}) {
	defer wg.Done()
	for i := 0; i < count; i++ {
		<-chanC
		fmt.Println("C")
		chanA <- struct{}{}
	}
}

使用context.WithCancel,通过time.Sleep控制打印数量

package main
import (
	"context"
	"fmt"
	"time"
)
func main() {
	chanA := make(chan struct{}, 1)
	chanB := make(chan struct{}, 1)
	chanC := make(chan struct{}, 1)
	chanA <- struct{}{}
	ctx1, cancel1 := context.WithCancel(context.Background())
	ctx2, cancel2 := context.WithCancel(context.Background())
	ctx3, cancel3 := context.WithCancel(context.Background())
	go printA(ctx1, chanA, chanB)
	go printB(ctx2, chanB, chanC)
	go printC(ctx3, chanC, chanA)
	time.Sleep(100 * time.Microsecond)
	cancel1()
	cancel2()
	cancel3()
}
func printA(ctx context.Context, chanA, chanB chan struct{}) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("cancel by parent") // 不会输出
			return
		case <-chanA:
			fmt.Println("A")
			chanB <- struct{}{}
		}
	}
}
func printB(ctx context.Context, chanB, chanC chan struct{}) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("cancel by parent") // 不会输出
			return
		case <-chanB:
			fmt.Println("B")
			chanC <- struct{}{}
		}
	}
}
func printC(ctx context.Context, chanC, chanA chan struct{}) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("cancel by parent") // 不会输出
			return
		case <-chanC:
			fmt.Println("C")
			chanA <- struct{}{}
		}
	}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
go语言map与string的相互转换的实现
Apr 07 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang使用map实现去除重复数组
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang并发工具Singleflight
May 06 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
golang 在windows中设置环境变量的操作
解决golang在import自己的包报错的问题
golang import自定义包方式
golang 接口嵌套实现复用的操作
Apr 29 #Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 #Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 #Golang
Golang 空map和未初始化map的注意事项说明
You might like
支持oicq头像的留言簿(二)
2006/10/09 PHP
php microtime获取浮点的时间戳
2010/02/21 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
提高php编程效率技巧
2015/08/13 PHP
10个php函数实用却不常见
2015/10/13 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
3的组成教学反思
2014/04/30 职场文书
服务之星事迹材料
2014/05/03 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
新兵入伍决心书
2015/09/22 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android
详解PyTorch模型保存与加载
2022/04/28 Python