Назад к вопросам
Middle
870
questionbank
Каким образом можно проверить работу горутины через канал?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Можно использовать семантику закрытия канала. Отправитель закрывает канал, когда все данные отправлены, а получатель может прочитать все данные и определить завершение по закрытию канала.
package main
import (
"fmt"
"sync"
"time"
)
func worker(done chan<- struct{}, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Горутина работает...")
time.Sleep(time.Second) // Имитация работы
fmt.Println("Горутина завершила работу.")
// Отправка сигнала о завершении через канал
//done <- struct{}{} // Можно использовать пустую структуру
}
func main() {
var wg sync.WaitGroup
done := make(chan struct{}) // Канал для сигнализации о завершении
wg.Add(1)
go worker(done, &wg)
// Ожидание завершения всех горутин или получение сигнала о завершении
go func() {
wg.Wait()
close(done) // Закрытие канала после завершения всех горутин
}()
// Получение сигнала о завершении
<-done
fmt.Println("Основная горутина получила сигнал о завершении работы.")
}
Использование селекта:
package main
import (
"fmt"
"time"
)
func worker(done chan<- bool) {
fmt.Println("Горутина работает...")
time.Sleep(time.Second) // Имитация работы
fmt.Println("Горутина завершила работу.")
done <- true // Отправка сигнала о завершении
}
func main() {
done := make(chan bool) // Канал для сигнализации о завершении
go worker(done)
// Ожидание сигнала о завершении
select {
case <-done:
fmt.Println("Основная горутина получила сигнал о завершении работы.")
case <-time.After(2 * time.Second): // Таймаут, если горутина зависла
fmt.Println("Таймаут: горутина не завершилась вовремя.")
}
}