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
|
.PHONY: build
|
||||||
build:
|
build:
|
||||||
go build -ldflags="\
|
go build -ldflags="\
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.Version=$(VERSION)' \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.Version=$(VERSION)' \
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.BuildTime=$(BUILD_TIME)' \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.BuildTime=$(BUILD_TIME)' \
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.Commit=$(COMMIT)' \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.Commit=$(COMMIT)' \
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.GoVersion=$(GO_VERSION)'" \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.GoVersion=$(GO_VERSION)'" \
|
||||||
-o catapult main.go
|
-o catapult cmd/catapult/main.go
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install:
|
install:
|
||||||
go install -ldflags="\
|
go install -ldflags="\
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.Version=$(VERSION)' \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.Version=$(VERSION)' \
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.BuildTime=$(BUILD_TIME)' \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.BuildTime=$(BUILD_TIME)' \
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.Commit=$(COMMIT)' \
|
-X 'git.kundeng.us/phoenix/catapult/internal/version.Commit=$(COMMIT)' \
|
||||||
-X 'git.kundeng.us/phoenix/catapult/version.GoVersion=$(GO_VERSION)'"
|
-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