mcpField
G
go-concurrency-patterns

go-concurrency-patterns

github.com/wshobson開発41.9k11.4k 回インストール2 週間前に更新
リポジトリ

go-concurrency-patterns について

Go 開発者向けに、本番環境で使う並行処理パターンを解説するスキルです。goroutine、チャネル、同期、context の処理、ライフサイクル管理を扱います。

主な機能

  1. 01並行処理プリミティブの概要
  2. 02ワーカープールとパイプライン
  3. 03goroutine のライフサイクル管理
  4. 04同期とキャンセル処理
  5. 05データ競合のデバッグ

活用シーン

  1. 01Go の並行アプリケーション構築
  2. 02ワーカープールの実装
  3. 03goroutine の正常な終了
  4. 04データ競合の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshobson/agents --skill go-concurrency-patterns

インストール後、Claude Code で/go-concurrency-patternsを入力して読み込まれたか確認します。

同梱ファイルreferences/details.md

詳細

Go 並行処理パターン

goroutine、チャネル、同期プリミティブ、コンテキスト管理など、Go の並行処理に関する本番向けパターンです。

このスキルを使用する場面

  • 並行処理を行う Go アプリケーションを構築する場合
  • ワーカープールとパイプラインを実装する場合
  • goroutine のライフサイクルを管理する場合
  • チャネルを使って通信する場合
  • 競合状態をデバッグする場合
  • グレースフルシャットダウンを実装する場合

中核となる概念

1. Go の並行処理プリミティブ
プリミティブ目的
goroutine軽量な並行実行
channelgoroutine 間の通信
selectチャネル操作の多重化
sync.Mutex相互排他
sync.WaitGroupgoroutine の完了を待機
context.Contextキャンセルとデッドライン
2. Go 並行処理のマントラ
Don't communicate by sharing memory;
share memory by communicating.

クイックスタート

package main

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    results := make(chan string, 10)
    var wg sync.WaitGroup

    // Spawn workers
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go worker(ctx, i, results, &wg)
    }

    // Close results when done
    go func() {
        wg.Wait()
        close(results)
    }()

    // Collect results
    for result := range results {
        fmt.Println(result)
    }
}

func worker(ctx context.Context, id int, results chan<- string, wg *sync.WaitGroup) {
    defer wg.Done()

    select {
    case <-ctx.Done():
        return
    case results <- fmt.Sprintf("Worker %d done", id):
    }
}

詳細なパターンと実例

詳細なパターンのドキュメントは references/details.md にあります。上記のナビゲーション階層では不十分な場合は、そのファイルをお読みください。

ベストプラクティス

推奨事項
  • context を使用する - キャンセルとデッドラインのために
  • チャネルをクローズする - 送信側からのみ
  • errgroup を使用する - エラーを伴う並行操作用に
  • チャネルをバッファリングする - 件数がわかっている場合
  • チャネルを優先する - 可能な場合はミューテックスよりも
非推奨事項
  • goroutine をリークさせない - 常に終了パスを用意する
  • 受信側からクローズしない - パニックの原因になります
  • 共有メモリを使用しない - 必要な場合を除いて
  • コンテキストのキャンセルを無視しない - ctx.Done() を確認する
  • 同期に time.Sleep を使用しない - 適切なプリミティブを使用する

コメント