Запись данных в один и тот же канал из разных подпрограмм go работает нормально без группы ожидания

currentid должен быть self.currentid, поскольку это переменная класса.

-2
задан BhanuReddy 11 March 2019 в 14:52
поделиться

2 ответа

По умолчанию a chan не содержит никаких элементов, поэтому все процедуры go блокируются при отправке до тех пор, пока что-то из них не будет считано. На самом деле они никогда не достигают утверждения wg.Done().

Решением было бы закрыть канал в своей собственной рутине. Оберните ваши строки wg.Wait() и close(ch) следующим образом:

go func() {
    wg.Wait() //wait for all go routines to complete
    close(ch) // closing channel after completion of wait fo go routines
}()

Затем вы можете выполнить диапазон по каналу, который закроется только после того, как все подпрограммы отправки завершены (и неявно все значения получено).

0
ответ дан Travis Hegner 11 March 2019 в 14:52
поделиться

Я думаю, что у вашего исходного кода есть некоторые проблемы.

  1. Вы закрываете канал перед чтением с него.
  2. Вы не получаете преимущества от использования 10 процедур, потому что ваш канал 1 «размера». Таким образом, одна процедура дает один результат за один раз.

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

Тогда код будет выглядеть так:

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var wg sync.WaitGroup

func main() {
    ch := make(chan int, 10)

    for i := 0; i < 10; i++ { // creates 10 go routines and adds to waitgroup
        wg.Add(1)
        go func() {
            for j := 0; j < 10; j++ {
                ch <- j
            }
            wg.Done() // indication of go routine is done to main routine
        }()
    }

    go func(){
        wg.Wait()
        close(ch)
    }()

    fmt.Println(runtime.NumGoroutine())
    for v := range ch { // range can be used since channel is closed
        fmt.Println(v)
    }
    fmt.Println("About to exit program ...")
}
0
ответ дан Jamillo Santos 11 March 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: