package main
import (
"sync"
"time"
"fmt"
)
func sub(message string) {
fmt.Printf("%s start\n", message)
time.Sleep(5 * time.Second)
fmt.Printf(" -> %s end\n", message)
time.Sleep(1 * time.Second)
}
func getMessages() (messages []string) {
messages = []string{
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
}
return
}
func main() {
// 並列数
concurrency := 4
// 並列キューを作成
limit := make(chan int, concurrency)
// WaitGroup 作成
var wg sync.WaitGroup
for _, message := range getMessages() {
// WaitGroup のカウンタを上げる
wg.Add(1)
// 並列処理開始
go func(message string, wg *sync.WaitGroup, limit chan int) {
// WaitGroup のカウンタを下げる
defer wg.Done()
// 並列キューに値1を入れる
limit <- 1
// 並列処理させたい関数を実行
sub(message)
// 並列キューから値を取得する (<-limit)
fmt.Printf(" (%d <-limit)\n", <-limit)
time.Sleep(2 * time.Second)
}(message, &wg, limit)
}
// WaitGroup のカウンタが0になるまで待つ
wg.Wait()
}
実行結果
h start
d start
a start
b start
-> b end
-> a end
-> d end
-> h end
(1 <-limit)
(1 <-limit)
(1 <-limit)
(1 <-limit)
g start
c start
e start
f start
-> c end
-> f end
-> e end
-> g end
(1 <-limit)
(1 <-limit)
(1 <-limit)
(1 <-limit)