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 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Go timer如何调度
Jun 09 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
mysql总结之explain
2012/02/27 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
简明 Python 基础学习教程
2007/02/08 Python
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
python实现排序算法解析
2018/09/08 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
python连接mongodb集群方法详解
2020/02/13 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
导游的职业规划书范文
2013/12/27 职场文书
寒假思想汇报
2014/01/10 职场文书
《自然之道》教学反思
2014/02/11 职场文书
抵押贷款承诺书
2014/05/30 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
电力培训心得体会
2014/09/02 职场文书