Node.jsとGoのスレッドモデルの違い
Go
Node.js
Node.js: シングルスレッド + イベントループ
- JavaScriptコードは常に1つのスレッドで実行
- I/O処理はlibuvのスレッドプール(デフォルト4スレッド)が裏で処理
- 非同期(
async/await)で並行処理を実現 - 1つのリクエスト処理中に別のリクエストも受け付け可能
- 長時間稼働プロセスのため、DBコネクションが無効化されるリスクあり
- プールからコネクション取得時に明示的な有効性確認が必要な場合がある
Go: マルチスレッド + Goroutine
- 複数のOSスレッドを使って並列実行
- Goroutineは軽量(2KBのスタックから開始)
- Goランタイムが自動的にGoroutineをスレッドに割り当て(M:Nスケジューリング)
- 真の並列処理が可能(マルチコアCPU活用)
database/sqlパッケージが自動的にコネクション管理- 無効なコネクションは自動で再接続