Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

vbauerster/mpb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Repository files navigation

Multi Progress Bar

GoDoc Test status Lint status

mpb is a Go lib for rendering progress bars in terminal applications.

Features

  • Multiple Bars: Multiple progress bars are supported
  • Dynamic Total: Set total while bar is running
  • Dynamic Add/Remove: Dynamically add or remove bars
  • Cancellation: Cancel whole rendering process
  • Predefined Decorators: Elapsed time, ewma based ETA, Percentage, Bytes counter
  • Decorator's width sync: Synchronized decorator's width among multiple bars

Usage

package main
import (
 "math/rand"
 "time"
 "github.com/vbauerster/mpb/v8"
 "github.com/vbauerster/mpb/v8/decor"
)
func main() {
 // initialize progress container, with custom width
 p := mpb.New(mpb.WithWidth(64))
 total := 100
 name := "Single Bar:"
 // create a single bar, which will inherit container's width
 bar := p.New(int64(total),
 // BarFillerBuilder with custom style
 mpb.BarStyle().Lbound("╢").Filler("▌").Tip("▌").Padding("░").Rbound("╟"),
 mpb.PrependDecorators(
 // display our name with one space on the right
 decor.Name(name, decor.WC{C: decor.DindentRight | decor.DextraSpace}),
 // replace ETA decorator with "done" message, OnComplete event
 decor.OnComplete(decor.AverageETA(decor.ET_STYLE_GO), "done"),
 ),
 mpb.AppendDecorators(decor.Percentage()),
 )
 // simulating some work
 max := 100 * time.Millisecond
 for i := 0; i < total; i++ {
 time.Sleep(time.Duration(rand.Intn(10)+1) * max / 10)
 bar.Increment()
 }
 // wait for our bar to complete and flush
 p.Wait()
}
 var wg sync.WaitGroup
 // passed wg will be accounted at p.Wait() call
 p := mpb.New(mpb.WithWaitGroup(&wg))
 total, numBars := 100, 3
 wg.Add(numBars)
 for i := 0; i < numBars; i++ {
 name := fmt.Sprintf("Bar#%d:", i)
 bar := p.AddBar(int64(total),
 mpb.PrependDecorators(
 // simple name decorator
 decor.Name(name),
 // decor.DSyncWidth bit enables column width synchronization
 decor.Percentage(decor.WCSyncSpace),
 ),
 mpb.AppendDecorators(
 // replace ETA decorator with "done" message, OnComplete event
 decor.OnComplete(
 // ETA decorator with ewma age of 30
 decor.EwmaETA(decor.ET_STYLE_GO, 30, decor.WCSyncWidth), "done",
 ),
 ),
 )
 // simulating some work
 go func() {
 defer wg.Done()
 rng := rand.New(rand.NewSource(time.Now().UnixNano()))
 max := 100 * time.Millisecond
 for i := 0; i < total; i++ {
 // start variable is solely for EWMA calculation
 // EWMA's unit of measure is an iteration's duration
 start := time.Now()
 time.Sleep(time.Duration(rng.Intn(10)+1) * max / 10)
 // we need to call EwmaIncrement to fulfill ewma decorator's contract
 bar.EwmaIncrement(time.Since(start))
 }
 }()
 }
 // wait for passed wg and for all bars to complete and flush
 p.Wait()

dynTotal

complex

io

AltStyle によって変換されたページ (->オリジナル) /