並列処理するためのネットワークプログラミング: GoのWaitGroupを利用した並列サーバーの実現
WaitGroup を使った Go での高性能サーバーの実装コード例を以下に示します。
package main
import (
"fmt"
"net"
"sync"
)
func handleRequest(conn net.Conn) {
defer conn.Close()
// 处理请求的逻辑,这里只是简单地回复一个消息
message := "Hello from server"
conn.Write([]byte(message))
}
func main() {
// 创建一个WaitGroup来等待所有goroutine完成
var wg sync.WaitGroup
// 启动并发服务器监听端口
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Failed to listen:", err)
return
}
fmt.Println("Server listening on port 8080")
// 接受并处理客户端连接
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("Failed to accept connection:", err)
continue
}
// 每个连接启动一个goroutine来处理请求
wg.Add(1)
go func() {
handleRequest(conn)
wg.Done()
}()
}
// 等待所有goroutine完成
wg.Wait()
}
上記のコードでは、まずすべての goroutine が完了するまで待つための sync.WaitGroup を作成しています。次に、並行サーバーを起動してポートを listen し、クライアント接続が受け入れられたら、各接続ごとに goroutine を作成してリクエストを処理しています。リクエストを処理する goroutine では、新しい goroutine が開始されたことを示すために wg.Add(1) を呼び出し、リクエスト処理が完了すると、その goroutine が終了したことを示すために wg.Done() を呼び出しています。最後に、メイン関数で wg.Wait() を呼び出して、すべての goroutine が完了するまで待っています。
基本的な並列サーバーの実装のみ扱っていますのでご注意ください。実際には、並列リクエストに対処するために、より複雑なロジックが必要になる場合があります。さらに、リソース管理、エラー処理などの問題も考慮する必要があります。