Golangの十八番と言えば並行処理なわけですが、それぞれの処理がどのくらいの進捗なのか知りたい!っということで、pbとuiprogressと言う人気のパッケージを使って動かしてみました。
Golangのプログレスバーを実装するパッケージについては、こちらの記事で紹介しています。
Golangでプログレスバーを表示するためのパッケージ3選
pbでやってみた
main.go
package main
import (
"log"
"math/rand"
"sync"
"time"
"github.com/cheggaaa/pb"
)
func processing(wg *sync.WaitGroup, b *pb.ProgressBar) {
defer wg.Done()
for n := 0; n < 200; n++ {
b.Increment()
rand.Seed(time.Now().UnixNano())
time.Sleep(time.Millisecond * time.Duration(rand.Intn(100)))
}
b.Finish()
}
func main() {
process_1 := pb.New(200).Prefix("process_1: ").SetMaxWidth(80)
process_2 := pb.New(200).Prefix("process_2: ").SetMaxWidth(80)
process_3 := pb.New(200).Prefix("process_3: ").SetMaxWidth(80)
pool, err := pb.StartPool(process_1, process_2, process_3)
if err != nil {
log.Fatal(err)
}
var wg sync.WaitGroup
for _, bar := range []*pb.ProgressBar{process_1, process_2, process_3} {
wg.Add(1)
go processing(&wg, bar)
}
wg.Wait()
pool.Stop()
}
uiprogressでやってみた
main.go
package main
import (
"math/rand"
"sync"
"time"
"github.com/gosuri/uiprogress"
"github.com/gosuri/uiprogress/util/strutil"
)
func processing(process_name string, wg *sync.WaitGroup, u *uiprogress.Bar) {
defer wg.Done()
u.PrependFunc(func(b *uiprogress.Bar) string {
return strutil.Resize(process_name + ": ", 11)
})
for u.Incr() {
rand.Seed(time.Now().UnixNano())
time.Sleep(time.Millisecond * time.Duration(rand.Intn(100)))
}
}
func main() {
uiprogress.Start()
process_1 := uiprogress.AddBar(100).AppendCompleted().PrependElapsed()
process_2 := uiprogress.AddBar(300).AppendCompleted().PrependElapsed()
process_3 := uiprogress.AddBar(200).AppendCompleted().PrependElapsed()
var wg sync.WaitGroup
wg.Add(1)
go processing("process_1", &wg, process_1)
wg.Add(1)
go processing("process_2", &wg, process_2)
wg.Add(1)
go processing("process_3", &wg, process_3)
wg.Wait()
}
まとめ
なんか実際動かしてみると、Dockerでイメージをpullする時みたいでエモいですねw
どちらのパッケージも使いやすいので、馴染みのいい方を選んでカスタムするといいと思います。