Sobes.tech
Senior

func (p *Pool) Stop() { p.mu.Unlock() // Teraz można bezpiecznie zamknąć kanał close(p.tasks) // sygnał dla workerów: nie będzie nowych zadań, odczytaj resztę p.wg.Wait() // czekaj na zakończenie wszystkich goroutine p.cancel() // anuluj kontekst na wszelki wypadek fmt.Println("Pool zatrzymany.") } // ForceStop wymusza zatrzymanie wszystkich workerów bez oczekiwania na zakończenie zadań. // Workerzy zostaną natychmiast przerwani przez kontekst. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Wymuszone zatrzymanie puli (timeout: %v)...\n", timeout) // Blokuje dodawanie nowych zadań p.mu.Lock() p.isOpen = false p.mu.Unlock() // Zamknij kanał, aby workerzy nie brali nowych zadań close(p.tasks) // Anuluj kontekst – to przerwie wszystkie wykonywane zadania p.cancel() // Daj ograniczony czas na zakończenie done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool wymuszenie zatrzymany (wszystkie worker zakończone)") case <-time.After(timeout): fmt.Println("Pool wymuszenie zatrzymany (timeout, mogą pozostać zawieszone goroutine)") } }