php小編蘋果在本文中將討論一個(gè)問題:“在goroutine中運(yùn)行服務(wù)器?”Goroutine是Go語言中輕量級(jí)的并發(fā)機(jī)制,可以在程序中創(chuàng)建數(shù)千個(gè)并發(fā)的執(zhí)行單元。但是,是否可以在goroutine中運(yùn)行服務(wù)器呢?這個(gè)問題的答案并不簡(jiǎn)單,需要考慮一些因素。在接下來的內(nèi)容中,我們將探討這個(gè)問題并給出一些解決方案。
問題內(nèi)容
我有一個(gè) Golang 服務(wù)正在監(jiān)聽 Kafka 消息,但我也想在其中啟動(dòng)一個(gè) http 服務(wù)器以進(jìn)行運(yùn)行狀況檢查。服務(wù)器代碼很簡(jiǎn)單:
package server import ( "net/http" "github.com/gin-gonic/gin" ) func Start() { port := ":8080" r := setupRouter() r.Run(port) } func setupRouter() *gin.Engine { r := gin.Default() r.GET("/health", func(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{"status": "OK"}) }) return r }
登錄后復(fù)制
在主函數(shù)中,我只調(diào)用 Start() 函數(shù)。
server.Start()
登錄后復(fù)制
這樣可以嗎?或者我應(yīng)該在像這樣的 goroutine 中完成此操作:
go func(){ server.Start() }()
登錄后復(fù)制
main.go 中還發(fā)生了很多其他事情 – 隊(duì)列偵聽器已初始化、數(shù)據(jù)庫(kù)等。
解決方法
如果您不希望 Run
阻塞您的主線程,您將需要一個(gè) go 例程。
go server.Start()