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
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
go原生库的中bytes.Buffer用法
Apr 25 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang中的并发和并行
May 08 Golang
Golang全局变量加锁的问题解决
May 08 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Golang获取List列表元素的四种方式
Apr 20 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
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
JQuery基础语法小结
2015/02/27 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
vue实现扫码功能
2020/01/17 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
python文字转语音的实例代码分析
2019/11/12 Python
python map比for循环快在哪
2020/09/21 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
连锁经营管理专业大学生求职信
2013/10/30 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
材料员岗位职责
2014/03/13 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python