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

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

帶通道的 WaitGroup

帶通道的 WaitGroup

Go
LEATH 2023-08-07 14:28:07
我一直在研究這個并想出了:type Function struct{? ? Function func(*TaskGroup, []interface{})? ? Args []interface{}}type TaskGroup struct{? ? Group sync.WaitGroup? ? Functions []Function}func (x *TaskGroup) Start() {? ? for _, Function := range x.Functions{? ? ? ? x.Group.Add(1)? ? ? ? go Function.Function(x, Function.Args)? ? }? ? x.Group.Wait()}為了更輕松地使用多個功能,我必須等待。以下測試將起作用,我不明白為什么:func auxC(x *TaskGroup, args []interface{}){? ? defer x.Group.Done()? ? messageOut := args[0].(chan string)? ? messageOut <- "TestC"}func auxD(x *TaskGroup, args []interface{}){? ? defer x.Group.Done()? ? messageOut := args[0].(chan string)? ? messageOut <- "TestD"}func TestTaskGroupBaseB(t *testing.T) {? ? messageC := make(chan string, 1)? ? messageD := make(chan string, 1)? ? tg := TaskGroup{? ? ? ? Functions: []Function{? ? ? ? ? ? {auxC, []interface{}{messageC}},? ? ? ? ? ? {auxD, []interface{}{messageD}},? ? ? ? },? ? }? ? tg.Start()? ? fmt.Println(<- messageC)? ? fmt.Println(<- messageD)? ? time.Sleep(100 * time.Millisecond)}我首先嘗試使用像這樣的無緩沖通道:messageC := make(chan string)messageD := make(chan string)但它不起作用,它只是永遠卡住而不做任何事情,所以我有幾個問題:為什么大小為 1 的緩沖通道可以工作,而無緩沖通道則不能?默認大小不是無緩沖1嗎?重構代碼,見注釋:主要/測試:func auxC(args []interface{}){? ? messageOut := args[0].(chan string)? ? messageOut <- "TestC"}func auxD(args []interface{}){? ? messageOut := args[0].(chan string)? ? messageOut <- "TestD"}func TestTaskGroupBaseB(t *testing.T) {? ? messageC := make(chan string,1)? ? messageD := make(chan string,1)? ? tg := TaskGroup{? ? ? ? Functions: []Function{? ? ? ? ? ? {auxC, []interface{}{messageC}},? ? ? ? ? ? {auxD, []interface{}{messageD}},? ? ? ? },? ? }? ? tg.Wait()? ? fmt.Println(<- messageC)? ? fmt.Println(<- messageD)? ? time.Sleep(100 * time.Millisecond)}任務組:type Function struct{? ? Function func([]interface{})? ? Args []interface{}}type TaskGroup struct{? ? Group sync.WaitGroup? ? Functions []Function
查看完整描述

1 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

使用緩沖區大小為 1 的通道,首先寫入緩沖區數據,然后 goroutine 結束,您可以在主 goroutine 中讀取緩沖數據。

當通道大小為零時,對通道的寫入會阻塞,直到另一個 goroutine 從中讀取。所以你的兩個 goroutine 都在等待寫入通道。如果在通道讀入 main 之后移動 Wait() 調用,它應該可以工作。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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