亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

Go
慕絲7291255 2023-08-07 10:46:15
我試圖理解負載測試工具/庫的源代碼中的Attack()函數(https://github.com/tsenart/vegeta/blob/44a49c878dd6f28f04b9b5ce5751490b0dce1e18/lib/attack.go#L253-L312vegeta ) 。我創建了一個簡化的示例: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")}我注意到這個函數立即返回而沒有打印foobar10 次。僅當wg.Wait()我看到該行中的注釋foobar在 1 秒后打印了 10 次時。這對我來說很有意義,因為函數在調用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()函數在不調用的情況下不會立即返回attack(),因為它wg.Wait()位于 Goroutine 內部?
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

vegeta 也會Attack立即返回,但通道中填充有仍在運行的 goroutine。一旦這些完成,通道就會關閉(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"

}


查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號