主頁(yè) > 知識(shí)庫(kù) > golang goroutine順序輸出方式

golang goroutine順序輸出方式

熱門標(biāo)簽:外呼系統(tǒng)顯本地手機(jī)號(hào) 評(píng)價(jià)高的400電話辦理 阿克蘇地圖標(biāo)注 電話機(jī)器人軟件免費(fèi) excel地圖標(biāo)注分布數(shù)據(jù) 外呼系統(tǒng)用什么卡 百度地圖標(biāo)注后傳給手機(jī) 壽光微信地圖標(biāo)注 涿州代理外呼系統(tǒng)

range字符串,使用goroutine打印

因?yàn)間oroutine隨機(jī)執(zhí)行

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

補(bǔ)充:golang goroutine順序循環(huán)打印ABC

分別使用sync.WaitGroup和context

使用sync.WaitGroup, 可控制循環(huán)次數(shù)

package main
import (
	"fmt"
	"sync"
)
//控制循環(huán)次數(shù)
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控制打印數(shù)量

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") // 不會(huì)輸出
			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") // 不會(huì)輸出
			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") // 不會(huì)輸出
			return
		case -chanC:
			fmt.Println("C")
			chanA - struct{}{}
		}
	}
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 解決Golang中g(shù)oroutine執(zhí)行速度的問題
  • golang gin 框架 異步同步 goroutine 并發(fā)操作
  • GOLANG使用Context管理關(guān)聯(lián)goroutine的方法
  • Golang 探索對(duì)Goroutine的控制方法(詳解)
  • 關(guān)于Golang中for-loop與goroutine的問題詳解
  • Golang 語(yǔ)言控制并發(fā) Goroutine的方法

標(biāo)簽:蘭州 吐魯番 汕頭 銅川 雞西 重慶 梅河口 欽州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang goroutine順序輸出方式》,本文關(guān)鍵詞  golang,goroutine,順序,輸出,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang goroutine順序輸出方式》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang goroutine順序輸出方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章