Как написать на тот же канал из нескольких goroutines - PullRequest
0 голосов

Мне нужно несколько goroutines для записи на одном канале. Затем все данные читаются в одном месте, пока все процедуры не завершат процесс. Но я не уверен, как лучше закрыть этот канал.

это мой пример реализации:

func main() {
    ch := make(chan data)
    wg := &sync.WaitGroup{}
    for instance := range dataSet {
        wg.Add(1)
        go doStuff(ch, instance)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()

    for v := range ch { //range until it closes
        //proceed v
    }
}

func doStuff(ch chan data, instance data) {
    //do some stuff with instance...
    ch <- instance
}

но я не уверен, что это идиоматично.

1 Ответ

1 голос
/ 22 мая 2019

Поскольку вы используете WaitGroup и увеличиваете счетчик во время запуска новой программы, вы должны уведомить WaitGroup о завершении процедуры, вызвав метод Done().Также вы должны передать тот же WaitGroup в рутину.Вы можете сделать это, передав адрес WaitGroup.В противном случае каждая программа будет использовать свою собственную WaitGroup, которая будет иметь различную область видимости.

func main() {
    ch := make(chan data)
    wg := &sync.WaitGroup{}
    for _, instance := range dataSet {
        wg.Add(1)
        go doStuff(ch, instance, wg)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()

    for v := range ch { //range until it closes
        //proceed v
    }
}

func doStuff(ch chan data, instance data, wg *sync.WaitGroup) {
    //do some stuff with instance...
    ch <- instance

    // call done method to decrease the counter of WaitGroup
    wg.Done()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...