1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我想出了如何使用 goroutines 來(lái)做到這一點(diǎn)。
我讀了這個(gè)例子,它教如何處理os.Signals使用渠道,我是這樣實(shí)現(xiàn)的:
首先,我在路由器上進(jìn)行了以下更改:
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
}
所以現(xiàn)在http.ListenAndServe()正在一個(gè)新線程中運(yùn)行。我相信默認(rèn)行為會(huì)在程序執(zhí)行結(jié)束時(shí)停止。
之后http.ListenAndServe(),我創(chuàng)建了一個(gè)os.Signalchanel,它將監(jiān)聽(tīng)來(lái)自系統(tǒng)的傳入信號(hào)(SIGINT 和 SIGTERM),然后該函數(shù)將停止在<-quit,它將等待一個(gè)信號(hào)繼續(xù)。
然后我修復(fù)了我在 goroutineSetupSuite()中運(yùn)行: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()向當(dāng)前進(jìn)程發(fā)送 SIGTERM 信號(hào)時(shí),quit我之前創(chuàng)建的通道將監(jiān)聽(tīng)該信號(hào),router.HandleRequests()并且該函數(shù)將繼續(xù)終止程序。
func (s *ReceiptServiceTestSuite) TearDownSuite() {
// some database code
p, _ := os.FindProcess(os.Getpid())
p.Signal(syscall.SIGINT)
}
- 1 回答
- 0 關(guān)注
- 269 瀏覽
添加回答
舉報(bào)