func (p *Pool) Stop() {
p.mu.Unlock()
// Most már biztonságosan bezárhatjuk a csatornát
close(p.tasks) // jelzés a munkásoknak: nem lesz több feladat, olvassa a maradékot
p.wg.Wait() // várjuk, hogy minden goroutine befejeződjön
p.cancel() // szükség esetén töröljük a kontextust
fmt.Println("Pool leállítva.")
}
// ForceStop kényszeríti az összes munkást, hogy befejezés nélkül álljanak le.
// A munkások azonnal megszakítódnak a kontextuson keresztül.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Kényszerített leállítás (timeout: %v)...\n", timeout)
// Blokkolja az új feladatok hozzáadását
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Bezárja a csatornát, hogy a munkások ne vegyenek fel új feladatokat
close(p.tasks)
// A kontextus megszakítása – ez minden futó feladatot megszakít
p.cancel()
// Korlátozott időt ad a befejezéshez
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool kényszerített leállítása (minden munkás befejeződött)")
case <-time.After(timeout):
fmt.Println("Pool kényszerített leállítása (timeout, maradhatnak függő goroutine-ok)")
}
}