gum/README.md
2023-09-11 16:52:38 +02:00

2.0 KiB

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 Run() 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
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) Run(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() {
    // 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, "work1")
    manager.AddUnit(worker2, "work2")

    // 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