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-дер калат)") } }