Service.go

package core

import (
	"sync"
	"time"
)

type Timer struct {
	start time.Time
}

func NewTimer() *Timer {
	return &Timer{start: time.Now()}
}

func (t *Timer) LastInterval() time.Duration {
	return time.Since(t.start)
}

func (t *Timer) Check() {
	t.start = time.Now()
}

type Service struct {
	args      map[string]string
	routine   []Routine
	pointer   int
	queue     chan func()
	iterate   time.Duration
	queueWait sync.WaitGroup
}

type Routine struct {
	function func()
	timer    *Timer
	ucycle   time.Duration
}

func NewService() *Service {
	return &Service{
		args:    make(map[string]string),
		routine: []Routine{},
		queue:   make(chan func(), 100), // Buffered channel to handle tasks
		iterate: time.Millisecond * 100,
	}
}

func (s *Service) SetArgs(args map[string]string) {
	s.args = args
}

func (s *Service) GetArgs() map[string]string {
	return s.args
}

func (s *Service) Init() {
	// Override to provide initialization logic
}

func (s *Service) Main() {
	s.TaskRoutine()
	s.TaskQueue()
	s.Iterate()
}

func (s *Service) Iterate() {
	time.Sleep(s.iterate)
}

func (s *Service) TaskRoutine() {
	if len(s.routine) == 0 {
		return
	}

	if s.pointer >= len(s.routine) {
		s.pointer = 0
	}

	routine := s.routine[s.pointer]
	s.pointer++

	if time.Since(routine.timer.start) > routine.ucycle {
		routine.function()
		routine.timer.Check()
	}
}

func (s *Service) TaskQueue() {
	select {
	case task := <-s.queue:
		if task != nil {
			task()
		}
	default:
	}
}

func (s *Service) AddRoutine(function func(), ucycle time.Duration) {
	s.routine = append(s.routine, Routine{
		function: function,
		timer:    NewTimer(),
		ucycle:   ucycle,
	})
}

func (s *Service) AddQueue(task func()) {
	s.queueWait.Add(1)
	s.queue <- func() {
		defer s.queueWait.Done()
		task()
	}
}

func (s *Service) WaitQueue() {
	s.queueWait.Wait()
}

Timer ๊ตฌ์กฐ์ฒด์™€ ๋ฉ”์„œ๋“œ

Timer๋Š” ์‹œ๊ฐ„ ์ธก์ •์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. NewTimer ํ•จ์ˆ˜

    • ์—ญํ• : ์ƒˆ๋กœ์šด Timer ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: ํ˜„์žฌ ์‹œ๊ฐ„์„ start ํ•„๋“œ์— ์ €์žฅํ•˜๊ณ  Timer ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. LastInterval ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ํƒ€์ด๋จธ๊ฐ€ ์‹œ์ž‘๋œ ์ดํ›„ ๊ฒฝ๊ณผ๋œ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: time.Since ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ start ์ดํ›„ ๊ฒฝ๊ณผ๋œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. Check ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ํƒ€์ด๋จธ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: ํ˜„์žฌ ์‹œ๊ฐ„์„ start ํ•„๋“œ์— ๋‹ค์‹œ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Service ๊ตฌ์กฐ์ฒด์™€ ๋ฉ”์„œ๋“œ

Service๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…(routine)๊ณผ ํ์— ์ €์žฅ๋œ ์ž‘์—…(queue)์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. NewService ํ•จ์ˆ˜

    • ์—ญํ• : ์ƒˆ๋กœ์šด Service ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: args, routine, queue๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , iterate ์ฃผ๊ธฐ๋ฅผ ์„ค์ •ํ•œ Service ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. SetArgs ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ์„œ๋น„์Šค์˜ ์ธ์ž๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: ์ธ์ž๋กœ ๋ฐ›์€ args ๋งต์„ args ํ•„๋“œ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  3. GetArgs ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ์„œ๋น„์Šค์˜ ์ธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: args ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. Init ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ์„œ๋น„์Šค ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋˜์–ด ๊ตฌ์ฒด์ ์ธ ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. Main ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ์„œ๋น„์Šค์˜ ์ฃผ ์ž‘์—… ๋ฃจํ”„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹:

      • TaskRoutine: ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

      • TaskQueue: ํ์— ์ €์žฅ๋œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

      • Iterate: ๋ฐ˜๋ณต ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

  6. Iterate ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ๋ฐ˜๋ณต ์ฃผ๊ธฐ ๋™์•ˆ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: time.Sleep์„ ์‚ฌ์šฉํ•˜์—ฌ iterate ํ•„๋“œ์— ์ง€์ •๋œ ์‹œ๊ฐ„๋งŒํผ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  7. TaskRoutine ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹:

      • pointer๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž‘์—…์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰ ์ฃผ๊ธฐ๊ฐ€ ์ง€๋‚ฌ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      • ์‹คํ–‰ ์ฃผ๊ธฐ๊ฐ€ ์ง€๋‚ฌ์œผ๋ฉด ํ•ด๋‹น ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ํƒ€์ด๋จธ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      • ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  8. TaskQueue ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ํ์— ์ €์žฅ๋œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: ํ์—์„œ ์ž‘์—…์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  9. AddRoutine ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ์ƒˆ๋กœ์šด ์ฃผ๊ธฐ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: ์ฃผ๊ธฐ ์ž‘์—…์„ routine ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์—๋Š” ํ•จ์ˆ˜์™€ ์‹คํ–‰ ์ฃผ๊ธฐ(ucycle), ํƒ€์ด๋จธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  10. AddQueue ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ํ์— ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹:

      • ์ž‘์—…์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด WaitGroup ์นด์šดํ„ฐ๋ฅผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

  11. WaitQueue ๋ฉ”์„œ๋“œ

    • ์—ญํ• : ํ์— ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์ž‘ ๋ฐฉ์‹: WaitGroup์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

์ด ์ฝ”๋“œ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…(routine)๊ณผ ํ์— ์ €์žฅ๋œ ์ž‘์—…(queue)์„ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ž‘์—…์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํ์—์„œ ๊บผ๋‚ด์ ธ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Service ๊ตฌ์กฐ์ฒด๋Š” ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Last updated