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的方法