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语言带缓冲的通道实现
Apr 26 Golang
golang goroutine顺序输出方式
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Golang 编译成DLL文件的操作
May 06 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Go语言入门exec的基本使用
May 20 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
PHP脚本的10个技巧(7)
2006/10/09 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
php实现网页端验证码功能
2017/07/11 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
Python求解正态分布置信区间教程
2019/11/20 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python实现密码强度校验
2020/03/18 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
selenium如何定位span元素的实现
2021/01/13 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
银行介绍信范文
2014/01/10 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python