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")
 }