# gum Go Unit Manager is a simple Goroutine unit manager for GoLang. Features: - Scheduling of multiple goroutines. - Shutdown on `os.Signal` events. - Gracefull shutdown of units ## Overview A unit is a type that implements `WorkUnit` interface. The `Spawn()` method of each registered unit is spawned in its own goroutine. The `Manager` handles communication and synchronized shutdown procedure. ## Usage 1. Create a unit manager 2. Implement the `WorkUnit` on your goroutines 3. Add units to the manager 4. Run the manager and wait on its `Quit` channel ```golang import ( "os" "log" "time" gum "git.sp4ke.com/sp4ke/gum.git" ) type Worker struct{} // Example loop, will be spwaned inside a goroutine func (w *Worker) Spawn(um UnitManager) { ticker := time.NewTicker(time.Second) // Worker's loop for { select { case <-ticker.C: log.Println("tick") // Read from channel if this worker unit should stop case <-um.ShouldStop(): // Shutdown work for current unit w.Shutdown() // Notify manager that this unit is done. um.Done() } } } func (w *Worker) Shutdown() { // Do shutdown procedure for worker return } func NewWorker() *Worker { return &Worker{} } func main() { // Create a unit manager manager := gum.NewManager() // Shutdown all units on SIGINT manager.ShutdownOn(os.Interrupt) // NewWorker returns a type implementing WorkUnit interface unit := worker := NewWorker() worker2 := NewWorker() // Register the unit with the manager manager.AddUnit(worker) manager.AddUnit(worker2) // Run the manager go manager.Run() // Wait for all units to shutdown gracefully through their `Shutdown` method <-manager.Quit } ``` ## Issues and Comments This repo is a mirror. For any question or issues use the repo hosted at [https://git.sp4ke.com/sp4ke/gum.git](https://git.sp4ke.com/sp4ke/gum.git)