1 回答
TA贡献1797条经验 获得超6个赞
我想出了如何使用 goroutines 来做到这一点。
我读了这个例子,它教如何处理os.Signals使用渠道,我是这样实现的:
首先,我在路由器上进行了以下更改:
func HandleRequests() {
router := mux.NewRouter()
router.Use(middleware)
// lots of router.HandleFunc()
go http.ListenAndServe(":8080", router)
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
}
所以现在http.ListenAndServe()正在一个新线程中运行。我相信默认行为会在程序执行结束时停止。
之后http.ListenAndServe(),我创建了一个os.Signalchanel,它将监听来自系统的传入信号(SIGINT 和 SIGTERM),然后该函数将停止在<-quit,它将等待一个信号继续。
然后我修复了我在 goroutineSetupSuite()中运行:router.HandleRequests()
func (s *ReceiptServiceTestSuite) SetupSuite() {
s.Require().NoError(godotenv.Load("test.env"))
s.Require().NoError(database.Connect())
s.db = database.DB
s.m = database.M
go router.HandleRequests()
}
在我TearDownSuite()向当前进程发送 SIGTERM 信号时,quit我之前创建的通道将监听该信号,router.HandleRequests()并且该函数将继续终止程序。
func (s *ReceiptServiceTestSuite) TearDownSuite() {
// some database code
p, _ := os.FindProcess(os.Getpid())
p.Signal(syscall.SIGINT)
}
- 1 回答
- 0 关注
- 324 浏览
添加回答
举报
