Sobes.tech
Senior

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)") } }