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各时间字符串使用解析
Apr 02 Golang
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
golang 实现并发求和
May 08 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang生成并解析JSON
Apr 14 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Go语言编译原理之变量捕获
Aug 05 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP date函数参数详解
2006/11/27 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
python解析中国天气网的天气数据
2014/03/21 Python
python网络编程示例(客户端与服务端)
2014/04/24 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
Python修改DBF文件指定列
2020/12/19 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
移交协议书
2014/08/19 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
工作建议书范文
2019/07/08 职场文书