Sobes.tech
Senior

func (p *Pool) Stop() { p.mu.Unlock() // Сега е безопасно да затворим канала close(p.tasks) // сигнал към работниците: няма да има нови задачи, прочетете остатъка p.wg.Wait() // чакаме всички горутини да приключат p.cancel() // отменяме контекста, ако е необходимо fmt.Println("Pool спря.") } // ForceStop принудително спира всички работници без да чака завършването на задачите. // Работниците ще бъдат прекъснати незабавно чрез контекста. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Принудително спиране на пула (таймаут: %v)...\n", timeout) // Блокира добавянето на нови задачи p.mu.Lock() p.isOpen = false p.mu.Unlock() // Затваря канала, за да не взимат нови задачи работниците close(p.tasks) // Отменя контекста – това ще прекъсне всички изпълняващи се задачи p.cancel() // Даваме ограничено време за завършване done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Пулът е принудително спрян (всички работници са завършили)") case <-time.After(timeout): fmt.Println("Пулът е принудително спрян (таймаут, може да останат висящи goroutine)") } }