Golang 터미널에서 프로그레스 바 구현하는 uiprogress 라이브러리 알아보기
오늘은 Golang으로 터미널에서 프로그레스 바(진행바)를 구현할 수 있는 uiprogress 라이브러리를 알아보려 합니다.
uiprogress 설치
우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.
맥에서 brew로 쉽게 설치할 수 있습니다.
brew install go
우분투에서도 apt로 쉽게 설치할 수 있습니다.
sudo apt-get install golang-go
go get으로 github에서 호스팅되고 있는 uiprogress 패키지를 설치합니다.
go get -v github.com/gosuri/uiprogress
홈의 go 폴더에 uiprogress 소스코드와 패키지 파일이 생성됩니다.
예제
package main
해당 소스코드를 실행 파일로 인식하게 해주도록 main이라고 선언합니다.
import (
"math/rand"
"sync"
"time"
"github.com/gosuri/uiprogress"
)
rand, sync, time 그리고 uiprogress를 가져옵니다.
func main() {
uiprogress.Start()
bar := uiprogress.AddBar(100)
bar.AppendCompleted()
bar.PrependElapsed()
for bar.Incr() {
time.Sleep(time.Millisecond * 10)
}
프로그레스 바를 생성하고 기본 progress container로 설정합니다.
AppendCompleted, PrependElapsed에 의해서 진행도와 진행 시간이 표시될 수 있습니다.
customBar := uiprogress.AddBar(4)
customBar.PrependFunc(func(bar *uiprogress.Bar) string {
return []string{"downloading", "removing", "updating", "running"}[bar.Current()-1]
})
for customBar.Incr() {
time.Sleep(time.Millisecond * 500)
}
PrependFunc 데코레이터 함수에 의해 프로그레스 바를 커스터마이징을 할 수 있습니다.
var wg sync.WaitGroup
bar1 := uiprogress.AddBar(100).AppendCompleted().PrependElapsed()
wg.Add(1)
go func() {
defer wg.Done()
for bar1.Incr() {
time.Sleep(time.Millisecond * 50)
}
}()
WaitGroup으로 동시성으로 만들어서 Incr 함수로 값을 계속 증가시키며 프로그레스 바를 만들 수 있습니다.
bar2 := uiprogress.AddBar(100).PrependElapsed().AppendCompleted()
wg.Add(1)
go func() {
defer wg.Done()
for i := 1; i <= bar2.Total; i++ {
bar2.Set(i)
time.Sleep(time.Millisecond * 50)
}
}()
wg.Wait()
}
또는 Set 함수로 프로그레스 바의 현재 진행도를 설정해주면서 값을 증가시키며 프로그레스 바를 만들 수 있습니다.
Written on August 8, 2019