Back to questions
Middle
982
questionbank
Каким образом можно проверить работу горутины через канал?
Sobes Copilot
Get answers in real time
Answer from AI
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("Таймаут: горутина не завершилась вовремя.")
}
}