畫江湖之 Go 學習篇 [訊號量]

Krisji發表於2019-03-26

 ## go如何透過訊號量控制併發量?

看程式碼

package main

import (
    "fmt"
    "math"
    "sync"
    "time"
)

var wg08 sync.WaitGroup
var chSem chan int

func main() {

    //透過管道定義訊號量5個 意思代表只能有五個同時併發
    chSem = make(chan int, 5)
    //起100個任務併發處理
    for i := 0; i < 100; i++ {
        wg08.Add(1)//等待組
        go getSqrt(i)//開闢協程處理
    }

    wg08.Wait()//等待組阻塞主協程
}

func getSqrt(n int) {
    //規定:所有併發任務都必須註冊在訊號量管道里
    chSem <- n

    fmt.Printf("%d的平方根是%.2f\n", n, math.Sqrt(float64(n)))
    <- time.After(10 * time.Second)//定時器

    //任務結束後從訊號量管道登出,給其它騰出空間
    <-chSem
    wg08.Done()
}

看下輸出內容 5個 5個的列印

畫江湖之go學習篇

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章