Slide 28
Slide 28 text
Copyright © LIMIA, Inc. All Rights Reserved.
// 単純に投げると、待たずに終わってしまう。
concurrent := make(chan struct{}, 5)
for i := start; i < end; i += step {
concurrent <- struct{}{}
go func(startAt uint64, endAt uint64) {
service.CreateByRange(startAt, endAt)
}(i, i+step)
}
並列数制限
こういうケースだと別ファイルにしてsystem()で起動していた。
28
// 当たり前だが、並列数制限して待つ必要がある。
var wg sync.WaitGroup
concurrent := make(chan struct{}, 5)
for i := start; i < end; i += step {
wg.Add(1)
concurrent <- struct{}{}
go func(startAt uint64, endAt uint64) {
defer func() {
wg.Done()
<-concurrent
}()
service.CreateByRange(startAt, endAt)
}(i, i+step)
}
wg.Wait()
// 待つだけだと、限界まで起動しちゃう。
var wg sync.WaitGroup
for i := start; i < end; i += step {
wg.Add(1)
go func(startAt uint64, endAt uint64) {
defer func() {
wg.Done()
}()
service.CreateByRange(startAt, endAt)
}(i, i+step)
}
wg.Wait()