<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          mpbmulti progress bar for Go cli applications

          聯(lián)合創(chuàng)作 · 2023-09-30 08:24

          Multi Progress Bar

          GoDoc Build Status Go Report Card Donate with PayPal

          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

          Rendering single bar

          package main
          
          import (
              "math/rand"
              "time"
          
              "github.com/vbauerster/mpb/v7"
              "github.com/vbauerster/mpb/v7/decor"
          )
          
          func main() {
              // initialize progress container, with custom width
              p := mpb.New(mpb.WithWidth(64))
          
              total := 100
              name := "Single Bar:"
              // adding a single bar, which will inherit container's width
              bar := p.Add(int64(total),
                  // progress bar filler with customized style
                  mpb.NewBarFiller(mpb.BarStyle().Lbound("╢").Filler("▌").Tip("▌").Padding("?").Rbound("╟")),
                  mpb.PrependDecorators(
                      // display our name with one space on the right
                      decor.Name(name, decor.WC{W: len(name) + 1, C: decor.DidentRight}),
                      // replace ETA decorator with "done" message, OnComplete event
                      decor.OnComplete(
                          decor.AverageETA(decor.ET_STYLE_GO, decor.WC{W: 4}), "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()
          }

          Rendering multiple bars

              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 60
                              decor.EwmaETA(decor.ET_STYLE_GO, 60, 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)
                          bar.Increment()
                          // we need to call DecoratorEwmaUpdate to fulfill ewma decorator's contract
                          bar.DecoratorEwmaUpdate(time.Since(start))
                      }
                  }()
              }
              // Waiting for passed &wg and for all bars to complete and flush
              p.Wait()

          Dynamic total

          Complex example

          Bytes counters

          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久人人妻人人做人人玩精品 | 丁香五月婷婷啪啪 | 亚洲自拍偷拍15P | 新av天堂 | 成人A片区 |