waitGroup
func waitGroupAction() {
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func(i int) {
defer wg.Done()
fmt.Printf("hi,%d\n", i)
fmt.Println("------")
}(i)
}
wg.Wait()
fmt.Println("所有并发控制结束")
}
通过context控制协程退出
package main
import (
"context"
"fmt"
"time"
)
func main() {
contextTest()
}
func contextTest() {
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
time.Sleep(1 * time.Second)
fmt.Println("停止了")
default:
time.Sleep(1 * time.Second)
fmt.Println("还在跑")
}
}
}(ctx)
time.Sleep(5 * time.Second)
cancel()
time.Sleep(2 * time.Second)
}
cond等待统一发号施令
package main
import (
"context"
"fmt"
"sync"
"time"
)
func main() {
condSyncTest()
}
func condSyncTest() {
var wg sync.WaitGroup
m := new(sync.Mutex)
cond := sync.NewCond(m)
wg.Add(5)
for i := 0; i < 5; i++ {
go func(i int) {
defer wg.Done()
cond.L.Lock()
fmt.Printf("准备好了:%v", i+1)
fmt.Println(",ready")
cond.Wait()
fmt.Println(i, "号到了")
cond.L.Unlock()
}(i)
}
time.Sleep(5 * time.Second)
fmt.Println("裁判已经就位,准备发令枪")
fmt.Println("比赛开始,大家准备跑")
cond.Broadcast()
wg.Wait()
time.Sleep(3 * time.Second)
}
automic大法
package main
import (
"fmt"
"sync/atomic"
)
func main() {
atomicAction()
}
func atomicAction() {
var b int64
var a atomic.Value
atomic.AddInt64(&b, 1)
a.Store(b)
fmt.Println(a.Load())
}
附赠: 超时模型
package main
import(
"context"
"fmt"
"time"
)
func main(){
timeOut()
}
func timeOut() {
result := make(chan string)
go func() {
time.Sleep(3 * time.Second)
result <- "服务端结果"
}()
select {
case v := <-result: fmt.Println(v)
case <-time.After(5 * time.Second): fmt.Println("网络访问超时了")
}
}