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 08 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
golang 实现Location跳转方式
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
golang使用map实现去除重复数组
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Go结合Gin导出Mysql数据到Excel表格
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中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php实现Mysql简易操作类
2015/10/11 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
Python生成验证码实例
2014/08/21 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
实习评语大全
2014/04/26 职场文书
环保倡议书格式范文
2014/05/14 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
介绍信应该怎么开?
2019/04/03 职场文书