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 27 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang jwt身份认证
Apr 20 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
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
Python中使用PDB库调试程序
2015/04/05 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python编程实现归并排序
2017/04/14 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Django多数据库联用实现方法解析
2020/11/12 Python
python中使用np.delete()的实例方法
2021/02/01 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
UNIX文件系统常用命令
2012/05/25 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
幼教简历自我评价
2014/01/28 职场文书
销售主管岗位职责
2014/02/08 职场文书
参观接待方案
2014/03/17 职场文书
运动会入场口号
2014/06/07 职场文书
爱心助学感谢信
2015/01/21 职场文书
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers