infra
/
goutils
Archived
1
0
Fork 0
This repository has been archived on 2022-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
goutils/handler/handler.go

49 lines
960 B
Go

package handler
import (
"sync"
"context"
"log"
)
// 자식들을 기다리는 context waiter
type Handler struct {
errorChan chan error
ctx context.Context
canceler context.CancelFunc
waiter *sync.WaitGroup
}
func NewHandler(ctx context.Context) *Handler {
ctx, canceler := context.WithCancel(ctx)
return &Handler{
ctx: ctx,
canceler: canceler,
waiter: &sync.WaitGroup{},
errorChan: make(chan error, 5),
}
}
func (h *Handler) NotifyError(err error) { h.errorChan <- err }
func (h *Handler) Error() <-chan error { return h.errorChan }
func (h *Handler) Done() <-chan struct{} { return h.ctx.Done() }
func (h *Handler) GracefulWait() {
if h.ctx.Err() == nil {
h.canceler()
}
h.waiter.Wait()
close(h.errorChan)
for remainError := range h.errorChan {
log.Println("remain errors ", remainError)
}
}
func (h *Handler) IncreaseWait() {
h.waiter.Add(1)
}
func (h *Handler) DecreaseWait() {
h.waiter.Done()
}