Sobes.tech
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("Таймаут: горутина не завершилась вовремя.")
	}
}