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

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

如何將 WaitGroup 傳遞給順序函數調用?

如何將 WaitGroup 傳遞給順序函數調用?

Go
蝴蝶刀刀 2023-03-15 15:28:56
我有一個可以在單獨的 goroutine 中順序或同時調用的函數。我想確保函數在主 goroutine 完成之前完全執行,所以我將 *sync.WaitGroup 參數傳遞給函數。現在,在某些地方要順序調用該函數。我可以像這樣將 nil waitGroup 傳遞給函數:func my_func(wg *sync.WaitGroup){   if wg != nil{   defer wg.Done()   }   // do the task}func main(){my_func(nil) // sequential callwg := sync.WaitGroup{}wg.Add(1)go my_func(&wg)  // concurrent callwg.Wait()}有沒有更好的方法來實現這一目標?
查看完整描述

1 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

你my_func()不應該知道/不應該關心它是如何執行的(無論是否在新的 goroutine 中)。所以就為了這個你不應該通過wg。不要強制并發或非并發使用你的 API,讓你的包的用戶決定他們希望如何調用它。


如果有人希望同時運行它,在一個新的 goroutine 中,wg可以這樣處理my_func():


wg.Add(1)

go func() {

    defer wg.Done()

    my_func()

}()

這也提供了在將在調用之前執行的函數調用之前/之后放置更多代碼的可能性wg.Done():


wg.Add(1)

go func() {

    defer wg.Done()


    // other code before

    my_func()

    // other code after

}()

還要注意,如果你在很多地方都有這個,你可以創建一個輔助函數來處理 goroutine 啟動和等待組處理:


func launchMyFunc(wg *sync.WaitGroup) {

    go func() {

        defer wg.Done()


        my_func()

    }()

}

您還可以創建一個接受任意無參數不返回函數的助手:


func launchFunc(wg *sync.WaitGroup, f func()) {

    go func() {

        defer wg.Done()


        f()

    }()

}

使用上面的助手,你可以這樣做:


wg.Add(1)

launchMyFunc(wg)


// or

wg.Add(1)

launchFunc(wg, my_func)


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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