diff --git a/signal/handler.go b/signal/handler.go index 5820f402..5195d4a3 100644 --- a/signal/handler.go +++ b/signal/handler.go @@ -8,3 +8,7 @@ type Handler interface { Listen() []os.Signal Handle(os.Signal) } + +type AsyncFeature interface { + Async() bool +} diff --git a/signal/server.go b/signal/server.go index 4191f9a5..d48e1160 100644 --- a/signal/server.go +++ b/signal/server.go @@ -83,7 +83,12 @@ func (s *Server) Start(ctx context.Context) error { case sig := <-ch: if hs, ok := handlers[sig]; ok { for _, h := range hs { - s.handle(sig, h) + // if Support AsyncFeature + if async, ok := h.(AsyncFeature); ok && async.Async() { + go s.handle(sig, h) + } else { + s.handle(sig, h) + } } } } diff --git a/signal/server_test.go b/signal/server_test.go index 7a1c5a42..74c22b3b 100644 --- a/signal/server_test.go +++ b/signal/server_test.go @@ -72,6 +72,10 @@ func (h *example2Handler) Listen() []os.Signal { return []os.Signal{syscall.SIGUSR1} } +func (h *example2Handler) Async() bool { + return false +} + func (h *example2Handler) Handle(os.Signal) { panic("example2Handler panic") }