> Как запустить две задачи параллельно и дождаться их результата (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Юрент
Стек: Go
> Пример ответа
В Go для параллельного запуска двух задач и ожидания их результатов используется комбинация горутин и каналов или sync.WaitGroup. Вот пример с sync.WaitGroup:
GOpackage mainimport ("fmt""sync")func task1(wg *sync.WaitGroup, result chan<- int) {defer wg.Done()// Имитация работыresult <- 42}func task2(wg *sync.WaitGroup, result chan<- string) {defer wg.Done()// Имитация работыresult <- "hello"}func main() {var wg sync.WaitGroupch1 := make(chan int, 1)ch2 := make(chan string, 1)wg.Add(2)go task1(&wg, ch1)go task2(&wg, ch2)wg.Wait() // Ожидаем завершения обеих задачres1 := <-ch1res2 := <-ch2fmt.Println(res1, res2) // 42 hello}
Альтернатива с каналами (без WaitGroup, если нужно получить результат сразу после завершения каждой задачи):
GOfunc main() {ch1 := make(chan int)ch2 := make(chan string)go func() { ch1 <- 42 }()go func() { ch2 <- "hello" }()res1 := <-ch1res2 := <-ch2fmt.Println(res1, res2)}
Ключевые моменты:
sync.WaitGroup- для синхронизации завершения горутин.- Каналы - для передачи результатов.
- Буферизированные каналы (размер 1) предотвращают блокировку при записи до чтения.
- В мобильной разработке (например, с Gomobile) используйте аналогичный подход, но учитывайте ограничения на горутины в UI-потоке.
> Похожие задачи по backend
Что происходит при выполнении функции main с набором принтов и что выводится в консоли
Вычистит ли сборщик мусора объекты, если они ссылаются друг на друга, но не имеют ссылок из корня
Какой интерфейс реализовать для JSON маршаллинга и анмаршаллинга в Go и почему методы должны иметь ресивер по указателю
Что такое embedding
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью