地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Go】workerプールのテンプレを書く

大容量ファイルのダウンロードだったり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)
    }
}