golang goroutine順序輸出方式
更新時間:2021年04月29日 11:46:48 作者:浩聞城
這篇文章主要介紹了golang goroutine順序輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
range字符串,使用goroutine打印
因為goroutine隨機執(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
補充: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") // 不會輸出
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小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入
這篇文章主要給大家介紹了關于Golang小數(shù)操作指南之判斷小數(shù)點位數(shù)與四舍五入的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-03-03
利用Golang解析json數(shù)據(jù)的方法示例
Go提供了原生的JSON庫,并且與語言本身有效的集成在了一起。下面這篇文章將給大家介紹關于利用Golang解析json數(shù)據(jù)的方法,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面跟著小編來一起學習學習吧。2017-07-07
golang常用庫之字段參數(shù)驗證庫-validator使用詳解
這篇文章主要介紹了golang常用庫:字段參數(shù)驗證庫-validator使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借價值,需要的朋友可以參考下2020-10-10

