Sobes.tech
Junior — Middle

Чӣ гуна метавон чанд goroutine-ро дар 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)

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