Sobes.tech
Junior — Middle

Как по принуда да спрете няколко работещи горутини в Go?

sobes.tech AI

Отговор от AI

В Go за принудително спиране на няколко работещи горутини обикновено се използва механизъм за отменяне чрез контекст (context.Context).

Основната идея:

  • Създава се контекст с отменяне (context.WithCancel или context.WithTimeout).
  • Всяка горутина получава този контекст и периодично проверява дали е отменен.
  • При извикване на функцията за отменяне (cancel()), всички горутини получават сигнал и могат да се затворят правилно.

Пример:

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Горутина %d е спряна\n", id)
                return
            default:
                // работа на горутината
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// След известно време спираме всички горутини
time.Sleep(1 * time.Second)
cancel()

// Изчакваме да приключат (например чрез sync.WaitGroup)

Този подход позволява централизирано управление на спирането на няколко горутини и избягва проблеми с неконтролирано приключване.