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 相关文章推荐
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
对Golang中的FORM相关字段理解
May 02 Golang
goland 设置project gopath的操作
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Golang 结构体数据集合
Apr 22 Golang
Go语言入门exec的基本使用
May 20 Golang
Golang实现可重入锁的示例代码
May 25 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
一个用php实现的获取URL信息的类
2007/01/02 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
node.js实现快速截图
2016/08/27 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
js+SVG实现动态时钟效果
2018/07/14 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
python处理PHP数组文本文件实例
2014/09/18 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
使用python绘制温度变化雷达图
2019/10/18 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
销售助理岗位职责
2014/02/21 职场文书
大学生工作自荐书
2014/06/16 职场文书
学生偷窃检讨书
2014/09/25 职场文书
钳工实训报告总结
2014/11/04 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技
Redis入门基础常用操作命令整理
2022/06/01 Redis