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("Принудно заустављање пула (timeout: %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-и)") } }