大容量ファイルのダウンロードだったりnasへの大量並列アクセスだったりをgoroutineで書くなら使えそうなワーカープール。サンプルはstring と worker id を受け取って、文字列のハッシュを計算というCPUリソースを食うやつだが色々と応用できるはず。
書いてからの話でもない気がするが結局1マシンである程度速度を求めるよりも結局Redisなりその他のジョブスケジューラ使って小さめのインスタンスをたくさん借りた方が安く早く終わる気がするから難しい。
package job import ( "fmt" "hash/fnv" "time" "math/rand" "os" ) var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") // create random string func RandStringRunes(n int) string { b := make([]rune, n) for i := range b { b[i] = letterRunes[rand.Intn(len(letterRunes))] } return string(b) } // create list of jobs func CreateJobs(amount int) []string { var jobs []string for i := 0; i < amount; i++ { jobs = append(jobs, RandStringRunes(8)) } return jobs } // mimics any type of job that can be run concurrently func DoWork(word string, id int) { h := fnv.New32a() h.Write([]byte(word)) time.Sleep(time.Second) if os.Getenv("DEBUG") == "true" { fmt.Printf("worker [%d] - created hash [%d] from word [%s]\n", id, h.Sum32(), word) } }