Sobes.tech
Middle

Hoe kun je de werking van een goroutine controleren via een kanaal?

sobes.tech AI

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