mmfiber / reversi

1 stars 0 forks source link

gin を使ったウェブサーバーの検討 #3

Open mmfiber opened 11 months ago

mmfiber commented 11 months ago

サーバーを複数立て並行に実行する方法の検討

gin の実装次第ではそもそも必要ないので要調査。 自前実装するとこんな感じになりそう。

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
        wg.Add(1)
        defer wg.Done()
    // 何かしらの処理
}

func main() {
    const numWorkers = 4 // たぶん cpu のコア数以上にしても意味がない気がする

        // どっかでリクエストを受け取ってワーカーに流してあげないといけない

    // Workerゴルーチンを起動
    for w := 0; w < numWorkers; w++ {
        go worker(w, &wg)
    }

    // Graceful Shutdownの準備
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit

    wg.Wait() // すべての goroutine が完了するのを待つ
    fmt.Println("Done.")
}
mmfiber commented 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.")
}