第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

注意進(jìn)入 Go 循環(huán)

注意進(jìn)入 Go 循環(huán)

Go
呼啦一陣風(fēng) 2022-09-12 16:59:53
我已經(jīng)編寫了代碼來(lái)獲取CPU內(nèi)核的使用百分比。如果一個(gè)內(nèi)核的 CPU 使用率低于 50%,我將運(yùn)行壓力測(cè)試代碼,以將使用率百分比提高到高于 50%。我必須為所有CPU內(nèi)核應(yīng)用此策略。這是我的完整代碼:package mainimport (    "fmt"    "io/ioutil"    "net/http"    "os"    "strconv"    "strings"    "time"    "github.com/dhoomakethu/stress/utils"    strip "github.com/grokify/html-strip-tags-go")func main() {    url := "http://localhost:8080/getCPU"    resp := Get(url)    //remove htlm tag    stripped := strip.StripTags(resp)    s := strings.Split(stripped, "%")    var j []int    for i := 0; i < len(s)-1; i++ {        number, _ := strconv.Atoi(s[i])        if number < 50 {            j = append(j, i)        }    }    fmt.Println(j)    sampleInterval := 100 * time.Millisecond    cpuload := 1.0    duration := 300.0    for a := 0; a < len(j)/2; a++ {        cpucore := j[a]        runCpuLoader(sampleInterval, cpuload, duration, cpucore)    }}//GETfunc Get(url string) string {    response, err := http.Get(url)    if err != nil {        fmt.Printf("%s", err)        os.Exit(1)    } else {        defer response.Body.Close()        contents, err := ioutil.ReadAll(response.Body)        if err != nil {            fmt.Printf("%s", err)            os.Exit(1)        }        return string(contents)    }    return ""}// stress cpufunc runCpuLoader(sampleInterval time.Duration, cpuload float64, duration float64, cpu int)   {    controller := utils.NewCpuLoadController(sampleInterval, cpuload)    monitor := utils.NewCpuLoadMonitor(float64(cpu), sampleInterval)    actuator := utils.NewCpuLoadGenerator(controller, monitor, time.Duration(duration))    utils.StartCpuLoadController(controller)    utils.StartCpuMonitor(monitor)    utils.RunCpuLoader(actuator)    utils.StopCpuLoadController(controller)    utils.StopCpuMonitor(monitor)}在這段代碼中for a := 0; a < len(j)/2; a++ {    cpucore := j[a]    runCpuLoader(sampleInterval, cpuload, duration, cpucore)   }}我希望代碼并發(fā)運(yùn)行壓力測(cè)試增加 CPU 使用率的百分比。但該函數(shù)的持續(xù)時(shí)間為 5 分鐘,因此它不能作為并發(fā)運(yùn)行。runCpuLoader(sampleInterval, cpuload, duration, cpucore)
查看完整描述

1 回答

?
德瑪西亞99

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊

您應(yīng)該完成圍棋之旅,并特別關(guān)注圍棋例程以及查看等待組。我將在這里簡(jiǎn)要介紹適用的概念。

關(guān)鍵字go

在Go中,同時(shí)運(yùn)行函數(shù)非常容易。鑒于以下代碼,我只需要在 前面添加前綴,使其與程序的其余部分同時(shí)運(yùn)行。goblockingCode

func blockingCode() {

    time.Sleep(time.Second)

    fmt.Println("finishing blocking")

}


func main() {

    fmt.Println("starting main")

    go blockingCode()

    fmt.Println("finishing main")

}

你會(huì)注意到關(guān)于這一點(diǎn)的幾件事:

  • 如果我刪除了前綴,該函數(shù)將被阻止,您將看到所有三個(gè)打印語(yǔ)句,最后兩個(gè)比第一個(gè)打印語(yǔ)句晚一秒(去游樂(lè)場(chǎng))。go

  • 如果我重新添加前綴,該函數(shù)不會(huì)阻塞,但您不會(huì)看到 print 語(yǔ)句。這是因?yàn)橹骱瘮?shù)(主 go 例程)在完成之前終止。這就是等待組發(fā)揮作用的地方。gofmt.Println("finishing blocking")blockingCode

WaitGroup

要等待多個(gè)戈魯丁完成,我們可以使用一個(gè)等待組。https://gobyexample.com/waitgroups

將等待組視為原子計(jì)數(shù)器,其中調(diào)用阻塞直到計(jì)數(shù)器為 0。生成 go 例程時(shí),會(huì)遞增計(jì)數(shù)器 (),在完成 go 例程時(shí),會(huì)取消遞增計(jì)數(shù)器 ()。下面是支持等待組的代碼。去游樂(lè)場(chǎng)wg.Waitwg.Addwg.Done

func blockingCode(wg *sync.WaitGroup) {

    defer wg.Done()

    time.Sleep(time.Second)

    fmt.Println("finishing blocking")

}


func main() {

    wg := sync.WaitGroup{}

    fmt.Println("starting main")

    wg.Add(1)

    go blockingCode(&wg)

    wg.Wait()

    fmt.Println("finishing main")

}

現(xiàn)在,這會(huì)產(chǎn)生與我們上面看到的完全相同的行為 - 該函數(shù)將阻塞,您將看到所有三個(gè)print語(yǔ)句,最后兩個(gè)比第一個(gè)延遲一秒鐘打印 - 那么為什么我們首先將其并發(fā)?不同之處在于,我們現(xiàn)在可以同時(shí)運(yùn)行許多事情,而不是按順序運(yùn)行很多事情。在這種情況下,我們沒(méi)有看到并發(fā)的好處的原因是因?yàn)槲覀冎煌瑫r(shí)做一件事。


讓我們調(diào)整示例以運(yùn)行多次。您會(huì)注意到,腳本運(yùn)行所需的時(shí)間幾乎相同,即使我們調(diào)用的 blockCode 需要整整一秒鐘才能運(yùn)行,三次,如果我們刪除關(guān)鍵字和等待組,我們會(huì)看到此代碼至少需要三秒鐘才能運(yùn)行 go Playground。blockingCodego


func blockingCode(wg *sync.WaitGroup) {

    defer wg.Done()

    time.Sleep(time.Second)

    fmt.Println("finishing blocking")

}


func main() {

    wg := sync.WaitGroup{}

    fmt.Println("starting main")

    wg.Add(1)

    go blockingCode(&wg)

    wg.Add(1)

    go blockingCode(&wg)

    wg.Add(1)

    go blockingCode(&wg)

    wg.Wait()

    fmt.Println("finishing main")

}

您的示例

您選擇如何處理并發(fā)行為很大程度上取決于應(yīng)用程序的細(xì)節(jié),但是像這樣的東西應(yīng)該實(shí)現(xiàn)我在這里提供的并發(fā)概念,并允許您與加載程序同時(shí)運(yùn)行監(jiān)視器。


func main() {

    // ...

    wg := sync.WaitGroup{}

    for a := 0; a < len(j)/2; a++ {

        cpucore := j[a]

        wg.Add(1)

        go runCpuLoader(&wg, sampleInterval, cpuload, duration, cpucore)

    }

    wg.Wait()

}


func runCpuLoader(wg *sync.WaitGroup, sampleInterval time.Duration, cpuload float64, duration float64, cpu int) {

    defer wg.Done()

    // ...

}


查看完整回答
反對(duì) 回復(fù) 2022-09-12
  • 1 回答
  • 0 關(guān)注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)