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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Goroutine 中延遲調(diào)用sync.WaitGroup.Wait():為什么這會起作用?

在 Goroutine 中延遲調(diào)用sync.WaitGroup.Wait():為什么這會起作用?

Go
慕絲7291255 2023-08-07 10:46:15
我試圖理解負(fù)載測試工具/庫的源代碼中的Attack()函數(shù)(https://github.com/tsenart/vegeta/blob/44a49c878dd6f28f04b9b5ce5751490b0dce1e18/lib/attack.go#L253-L312vegeta ) 。我創(chuàng)建了一個簡化的示例:package mainimport (    "fmt"    "sync"    "time")func main() {    var wg sync.WaitGroup    for i := 0; i < 10; i++ {        wg.Add(1)        go attack(&wg)    }    // wg.Wait()    go func() {        defer wg.Wait()    }()}func attack(wg *sync.WaitGroup) {    defer wg.Done()    time.Sleep(1 * time.Second)    fmt.Println("foobar")}我注意到這個函數(shù)立即返回而沒有打印foobar10 次。僅當(dāng)wg.Wait()我看到該行中的注釋foobar在 1 秒后打印了 10 次時。這對我來說很有意義,因為函數(shù)在調(diào)用main()之前返回。wg.Wait()該attack()方法讀取的位置func (a *Attacker) attack(tr Targeter, name string, workers *sync.WaitGroup, ticks <-chan struct{}, results chan<- *Result) {    defer workers.Done()    for range ticks {        results <- a.hit(tr, name)    }}我不明白為什么該Attack()函數(shù)在不調(diào)用的情況下不會立即返回attack(),因為它wg.Wait()位于 Goroutine 內(nèi)部?
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗 獲得超13個贊

vegeta 也會Attack立即返回,但通道中填充有仍在運行的 goroutine。一旦這些完成,通道就會關(guān)閉(defer close(results)),從而啟用必須檢測完成的代碼result。


例子;


package main


import (

    "fmt"

    "sync"

    "time"

)


func main() {

    results := attacks()


    fmt.Println("attacks returned")


    for result := range results {

        fmt.Println(result)

    }

}


func attacks() chan string {

    // A channel to hold the results

    c := make(chan string)


    // Fire 10 routines populating the channel

    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {

        wg.Add(1)

        go func() {

            attack(c)

            wg.Done()

        }()

    }


    // Close channel once routines are finished

    go func() {

        wg.Wait()

        close(c)

    }()


    //

    return c

}


func attack(c chan<- string) {

    time.Sleep(1 * time.Second)

    c <- "foobar"

}


查看完整回答
反對 回復(fù) 2023-08-07
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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