Как получить от канала, пока он не имеет значения в GO

Функция имеет цикл, который вызывает процедуру go внутри нее с переданным в нее каналом. После этого я пытаюсь получить от канала, пока он не имеет значений.

Функция go передает значение в канал при каждом вызове.

Мой канал работает бесконечно.

func (m *StreamsDAO) FindOutput (входная модель. Ввод) ([] модель. Вывод, ошибка) {

// SOME CODE

var chanNumber int = (input.EndTime - input.StartTime)/60
outputChan := make(chan model.Output, chanNumber)
for i := input.StartTime; i < input.EndTime ;i = i+(slider*60) {

// SOME CODE

    go ForEachSlide(i, outputChan)
    for outputC := range outputChan {
        outputs = append(outputs, outputC)
    }
}
return outputs, err

}

func ForEachSlide(i int, outputChan chan model.Output) {

// SOME CODE

outputChan <- output
//  close(outputChan)

}

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

Конструкция for range над каналом получает все значения, которые были отправлены по нему до закрытия. Затем он прекращается, когда канал закрывается.

icza 24.04.2019 13:20

Здесь это для диапазона не заканчивается, я думаю. Если я раскомментирую close(outputChan), это не позволит получить все значения.

hellokuldeep 24.04.2019 13:36
for range завершается, когда получены все значения, которые были отправлены до закрытия канала. Если канал не закрыт, он не завершится.
icza 24.04.2019 13:39

Да, вот что я спрашиваю, я не могу закрыть канал в конце второй функции. Поскольку это буферизованный канал, я хочу получить от него больше пользы. for range здесь не завершается, так как ожидается больше значений в канале. Я хочу, чтобы эта проблема была решена, как только все значения из канала будут использованы, for range должен завершиться или какой-либо другой метод, который может сделать подобное.

hellokuldeep 24.04.2019 15:45

Если вы хотите отправить больше значений, не закрывайте его; но если вы отправляете больше значений, вы также не хотите, чтобы потребитель прекратил цикл, поэтому кажется, что все работает как надо. Какое именно поведение вы ищете?

Adrian 24.04.2019 15:47

Нет, я думаю, что когда я не закрываюсь, это означает, что он не останавливается для приема с канала, и он застревает там навсегда. Его следует остановить, когда все предметы из канала будут израсходованы, тогда можно будет активировать только return.

hellokuldeep 24.04.2019 16:09
for range останавливается, если канал был закрыт и все значения получены. Пожалуйста, покажите минимальный воспроизводимый пример, который воспроизводит вашу проблему, без этого ваш вопрос не по теме.
icza 24.04.2019 16:15
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
7
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то получил ответ, используя WaitGroup. Ссылка для полного ознакомления: https://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/

Другие вопросы по теме