Open mmfiber opened 11 months ago
こっちがいいかも(だいたい) sigterm 後もリクエスト受け取っちゃいそうだけど。
func run(wg *sync.WaitGroup, req <- chan struct{}) {
c := make(chan int)
ports := []int{8000, 8001, 8002, 8003} // cpu のコア数以上は多分意味ない
for _, port := range ports {
// port を使ってサーバ起動
for {
wg.Add(1)
go func(req) {
defer wg.Done()
doSomething(<-req)
}(req)
}
}
return c
}
func main() {
var wg sync.WaitGroup
// server を起動
req := make(chan struct{})
run(&wg, req)
// Graceful Shutdownの準備
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
for {
select {
case <-quit:
break;
}
}
wg.Wait() // すべての goroutine が完了するのを待つ
fmt.Println("Done.")
}
サーバーを複数立て並行に実行する方法の検討
gin の実装次第ではそもそも必要ないので要調査。 自前実装するとこんな感じになりそう。