Один канал с двумя читателями распределит каждое число ровно одному из них. Производитель закрывает канал, main ждёт обоих потребителей.
Программа с тремя сопрограммами: генерация и вывод чисел
Один канал с двумя читателями распределит каждое число ровно одному из них. Производитель закрывает канал, main ждёт обоих потребителей.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать приложение, состоящее из трёх потоков (или сопрограмм). Первый поток отвечает за генерацию последовательности чисел и передаёт их двум остальным потокам. Оставшиеся два потока принимают полученные значения и выводят их на экран. После завершения работы программы на экране должны появиться все сгенерированные числа в произвольном порядке, но без повторений.
Ответ
Один канал с двумя читателями распределит каждое число ровно одному из них. Производитель закрывает канал, main ждёт обоих потребителей.
Три рабочие горутины плюс main для координации:
package main
import (
"fmt"
"sync"
)
func main() {
numbers := make(chan int)
go func() {
defer close(numbers)
for i := 1; i <= 10; i++ { numbers <- i }
}()
var wg sync.WaitGroup
for worker := 0; worker < 2; worker++ {
wg.Add(1)
go func() {
defer wg.Done()
for value := range numbers { fmt.Println(value) }
}()
}
wg.Wait()
}
Все числа 1–10 получит один из читателей. Порядок печати произволен; отправка каждого числа в два разных канала дала бы дубликаты. Гарантия относится к обычному выполнению одного процесса, а не восстановлению после сбоя.