猿问

带通道的 WaitGroup

我一直在研究这个并想出了:

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 的缓冲通道可以工作,而无缓冲通道则不能?

  2. 默认大小不是无缓冲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


LEATH
浏览 113回答 1
1回答

Cats萌萌

使用缓冲区大小为 1 的通道,首先写入缓冲区数据,然后 goroutine 结束,您可以在主 goroutine 中读取缓冲数据。当通道大小为零时,对通道的写入会阻塞,直到另一个 goroutine 从中读取。所以你的两个 goroutine 都在等待写入通道。如果在通道读入 main 之后移动 Wait() 调用,它应该可以工作。
随时随地看视频慕课网APP

相关分类

Go
我要回答