From c47941acafaf94bfca0be5c5d3ce35e0a341a6c2 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 27 Nov 2025 01:26:09 +0000 Subject: [PATCH] tsk-3: Create async loop (#4) Closes #3 Reviewed-on: https://git.kundeng.us/phoenix/catapult/pulls/4 Co-authored-by: phoenix Co-committed-by: phoenix --- Makefile | 19 +++---- cmd/catapult/main.go | 31 ++++++++++++ internal/config/config.go | 102 ++++++++++++++++++++++++++++++++++++++ main.go | 22 -------- 4 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 cmd/catapult/main.go create mode 100644 internal/config/config.go delete mode 100644 main.go diff --git a/Makefile b/Makefile index 84b9a7a..a189b6c 100644 --- a/Makefile +++ b/Makefile @@ -6,16 +6,17 @@ GO_VERSION ?= $(shell go version | awk '{print $$3}') .PHONY: build build: go build -ldflags="\ - -X 'git.kundeng.us/phoenix/catapult/version.Version=$(VERSION)' \ - -X 'git.kundeng.us/phoenix/catapult/version.BuildTime=$(BUILD_TIME)' \ - -X 'git.kundeng.us/phoenix/catapult/version.Commit=$(COMMIT)' \ - -X 'git.kundeng.us/phoenix/catapult/version.GoVersion=$(GO_VERSION)'" \ - -o catapult main.go + -X 'git.kundeng.us/phoenix/catapult/internal/version.Version=$(VERSION)' \ + -X 'git.kundeng.us/phoenix/catapult/internal/version.BuildTime=$(BUILD_TIME)' \ + -X 'git.kundeng.us/phoenix/catapult/internal/version.Commit=$(COMMIT)' \ + -X 'git.kundeng.us/phoenix/catapult/internal/version.GoVersion=$(GO_VERSION)'" \ + -o catapult cmd/catapult/main.go .PHONY: install install: go install -ldflags="\ - -X 'git.kundeng.us/phoenix/catapult/version.Version=$(VERSION)' \ - -X 'git.kundeng.us/phoenix/catapult/version.BuildTime=$(BUILD_TIME)' \ - -X 'git.kundeng.us/phoenix/catapult/version.Commit=$(COMMIT)' \ - -X 'git.kundeng.us/phoenix/catapult/version.GoVersion=$(GO_VERSION)'" + -X 'git.kundeng.us/phoenix/catapult/internal/version.Version=$(VERSION)' \ + -X 'git.kundeng.us/phoenix/catapult/internal/version.BuildTime=$(BUILD_TIME)' \ + -X 'git.kundeng.us/phoenix/catapult/internal/version.Commit=$(COMMIT)' \ + -X 'git.kundeng.us/phoenix/catapult/internal/version.GoVersion=$(GO_VERSION)'" + -o catapult cmd/catapult/main.go diff --git a/cmd/catapult/main.go b/cmd/catapult/main.go new file mode 100644 index 0000000..9853b05 --- /dev/null +++ b/cmd/catapult/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "git.kundeng.us/phoenix/catapult/internal/config" + "git.kundeng.us/phoenix/catapult/internal/version" +) + +func main() { + fmt.Println(config.App_Name) + + versionFlag := config.CheckVersionFlag() + if *versionFlag { + fmt.Println(version.String()) + return + } + + service := config.NewService() + + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + + service.Start() + + <-sigChan + service.Stop() +} diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..7dcdd13 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,102 @@ +package config + +import ( + "context" + "flag" + "log" + "sync" + "time" +) + +const App_Name = "catapult" + +func CheckVersionFlag() *bool { + versionFlag := flag.Bool("version", false, "Print version information") + flag.Parse() + + return versionFlag +} + +type Service struct { + wg sync.WaitGroup + ctx context.Context + cancel context.CancelFunc +} + +func NewService() *Service { + ctx, cancel := context.WithCancel(context.Background()) + return &Service{ + ctx: ctx, + cancel: cancel, + } +} + +func (s *Service) Start() { + log.Println("Starting service...") + + // Start multiple background workers + s.wg.Add(3) + go s.worker1() + go s.worker2() + go s.healthChecker() +} + +func (s *Service) worker1() { + defer s.wg.Done() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + + for { + select { + case <-s.ctx.Done(): + log.Println("Worker 1 shutting down...") + return + case <-ticker.C: + // Do some work + log.Println("Worker 1: Processing...") + } + } +} + +func (s *Service) worker2() { + defer s.wg.Done() + + ticker := time.NewTicker(10 * time.Second) + defer ticker.Stop() + + for { + select { + case <-s.ctx.Done(): + log.Println("Worker 2 shutting down...") + return + case <-ticker.C: + // Do some work + log.Println("Worker 2: Processing...") + } + } +} + +func (s *Service) healthChecker() { + defer s.wg.Done() + + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + + for { + select { + case <-s.ctx.Done(): + log.Println("Health checker shutting down...") + return + case <-ticker.C: + log.Println("Health check: Service is healthy") + } + } +} + +func (s *Service) Stop() { + log.Println("Shutting down service...") + s.cancel() + s.wg.Wait() + log.Println("Service stopped gracefully") +} diff --git a/main.go b/main.go deleted file mode 100644 index f3135ce..0000000 --- a/main.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "flag" - "fmt" - - "git.kundeng.us/phoenix/catapult/internal/version" -) - -const App_Name = "catapult" - -func main() { - fmt.Println(App_Name) - - versionFlag := flag.Bool("version", false, "Print version information") - flag.Parse() - - if *versionFlag { - fmt.Println(version.String()) - return - } -}