go并发控制实例

400 阅读1分钟

waitGroup

func waitGroupAction() {
	//var cond sync.Cond
	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 doTimeOutStuff(ctx)
	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等待统一发号施令

// You can edit this code!
// Click here and start typing.
package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

func main() {
	condSyncTest()
}

func condSyncTest() {
	//var cond sync.Cond
	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()  //统一控制
	// for i := 0; i < 5; i++ {
	//	cond.Signal() //发令枪响,一个个发
	//	fmt.Printf("一个一个跑,%d\n", i)
	//}
	wg.Wait()
	time.Sleep(3 * time.Second)
}

automic大法

package main

import (
	"fmt"
	"sync/atomic"
)

func main() {
	atomicAction()
}

//atomic原子操作
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()
}
//channel超时模型 
func timeOut() { 
    result := make(chan string) 
    go func() { 
        //模拟网络访问 
        time.Sleep(3 * time.Second)
        // time.Sleep(6 * time.Second)
        result <- "服务端结果" 
    }()
    select { 
        case v := <-result: fmt.Println(v) 
        case <-time.After(5 * time.Second): fmt.Println("网络访问超时了")
    }
}