tsk-3: Create async loop (#4)
Closes #3 Reviewed-on: #4 Co-authored-by: phoenix <kundeng00@pm.me> Co-committed-by: phoenix <kundeng00@pm.me>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user