• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang goroutine顺序输出方式

    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中goroutine执行速度的问题
    • golang gin 框架 异步同步 goroutine 并发操作
    • GOLANG使用Context管理关联goroutine的方法
    • Golang 探索对Goroutine的控制方法(详解)
    • 关于Golang中for-loop与goroutine的问题详解
    • Golang 语言控制并发 Goroutine的方法
    上一篇:golang 在windows中设置环境变量的操作
    下一篇:Go使用协程交替打印字符
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang goroutine顺序输出方式 golang,goroutine,顺序,输出,