vbauerster / mpb

multi progress bar for Go cli applications
The Unlicense
2.29k stars 123 forks source link

any way pop log without sleeping? #85

Closed imfht closed 3 years ago

imfht commented 3 years ago

https://github.com/vbauerster/mpb/blob/0e8b18ae8c3e90ab5e3abea2d2f8d8c6bc16f19e/_examples/poplog/main.go#L57

Thanks!

vbauerster commented 3 years ago

Sure, just remove it.

imfht commented 3 years ago

when the sleep removed.I get repeatly log.

code

package main

import (
    "fmt"
    "io"
    "math/rand"
    "sync"
    "time"

    "github.com/vbauerster/mpb/v5"
    "github.com/vbauerster/mpb/v5/decor"
)

func main() {
    p := mpb.New(mpb.PopCompletedMode())

    total, numBars := 100, 2
    for i := 0; i < numBars; i++ {
        name := fmt.Sprintf("Bar#%d:", i)
        bar := p.AddBar(int64(total),
            mpb.BarNoPop(),
            mpb.PrependDecorators(
                decor.Name(name),
                decor.Percentage(decor.WCSyncSpace),
            ),
            mpb.AppendDecorators(
                decor.OnComplete(
                    decor.EwmaETA(decor.ET_STYLE_GO, 60), "done!",
                ),
            ),
        )
        // simulating some work
        go func() {
            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))
            }
        }()
    }

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        for i := 0; i < 10; i++ {
            filler := makeLogBar(fmt.Sprintf("some log: %d", i))
            p.Add(0, filler).SetTotal(0, true)
        }
    }()

    wg.Wait()
    p.Wait()
}

func makeLogBar(msg string) mpb.BarFiller {
    limit := "%%.%ds"
    return mpb.BarFillerFunc(func(w io.Writer, _ int, st decor.Statistics) {
        fmt.Fprintf(w, fmt.Sprintf(limit, st.AvailableWidth), msg)
    })
}

result

image

Coud you have a look? Thanks!

vbauerster commented 3 years ago

Thanks for picture, now I got what you meant. Can you please check out latest master 994c170d49166b2a9b722edd11bb761ac7a38e43?

imfht commented 3 years ago

thanks~ it works!