Библиотека на Go для отображения полос прогресса в консольных приложениях. Она предоставляет набор гибких возможностей с настраиваемым API.
Полосы прогресса повышают читаемость консольных приложений с длинными выводами, предоставляя компактный обратный путь.
Чтобы начать отслеживание полос прогресса, вызовите goprogressor.Start()
и добавьте полосу прогресса с помощью goprogressor.AddBar(total int)
. Обновите прогресс с помощью bar.Incr()
или bar.Set(n int)
. Полный исходный код для приведённого ниже примера доступен по адресу example/simple/simple.go.
goprogressor.Start() // начать отрисовку
bar := goprogressor.AddBar(100) // добавить новую полосу
// опционально, прикрепить или добавить процент завершения и затраченное время
bar.AppendCompleted()
bar.PrependElapsed()
``````go
for bar.Incr() {
time.Sleep(time.Millisecond * 20)
}
Это отобразит следующее в консоли:
Вы также можете добавить персонализированную декораторную функцию помимо стандартных bar.AppendCompleted()
и bar.PrependElapsed()
. Приведенный ниже пример отслеживает текущий шаг для прогресса развертывания приложения. Исходный код для данного примера доступен по адресу example/full/full.go.
var steps = []string{"скачивание исходников", "установка зависимостей", "скомпилировано", "упаковано", "заполнение базы данных", "развернуто", "запущены серверы"}
bar := goprogressor.AddBar(len(steps))
// добавить текущий шаг перед полосой
bar.PrependFunc(func(b *goprogressor.Bar) string {
return "приложение: " + steps[b.Current()-1]
})
for bar.Incr() {
time.Sleep(time.Millisecond * 10)
}
Вы можете добавить несколько полос с помощью goprogressor.AddBar(n)
. Приведенный ниже пример демонстрирует обновление нескольких полос параллельно и добавление новой полосы позже в процессе. Исходный код для этого примера доступен по адресу example/multi/multi.go.
waitTime := time.Millisecond * 100
goprogressor.Start()
// запускаем прогресс-бары в отдельных горутинах
var wg sync.WaitGroup
bar1 := goprogressor.AddBar(20).AppendCompleted().PrependElapsed()
wg.Add(1)
go func() {
defer wg.Done()
for bar1.Incr() {
time.Sleep(waitTime)
}
}()
bar2 := goprogressor.AddBar(40).AppendCompleted().PrependElapsed()
wg.Add(1)
go func() {
defer wg.Done()
for bar2.Incr() {
time.Sleep(waitTime)
}
}()
```time.Sleep(time.Second)
bar3 := goprogressor.AddBar(20).PrependElapsed().AppendCompleted()
wg.Add(1)
go func() {
defer wg.Done()
for i := 1; i <= bar3.Total; i++ {
bar3.Set(i)
time.Sleep(waitTime)
}
}()
// ждём завершения всех горутин
wg.Wait()
---
Это создаст

### Увеличение счётчика (`Incr`)
[Bar.Incr()](https://godoc.org/gitee.com/shirdonl/goProgressor#Bar.Incr) является атомарным счётчиком и может использоваться как общее средство трекинга, что делает его идеальным для отслеживания прогресса работы, распределённой на множество горутин. Исходный код для данного примера доступен по адресу [example/incr/incr.go](example/incr/incr.go)
```go
runtime.GOMAXPROCS(runtime.NumCPU()) // использовать все доступные ядра процессора
// создаём новый бар и добавляем информацию о текущем прогрессе задачи к нему, затем распределяем её на 1000 горутин
count := 1000
bar := goprogressor.AddBar(count).AppendCompleted().PrependElapsed()
bar.PrependFunc(func(b *goprogressor.Bar) string {
return fmt.Sprintf("Задача (%d/%d)", b.Current(), count)
})
goprogressor.Start()
var wg sync.WaitGroup
// распределяем задачи на горутины
for i := 0; i < count; i++ {
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Millisecond * time.Duration(rand.Intn(500)))
bar.Incr()
}()
}
time.Sleep(time.Second) // ждём секунду до завершения всех горутин
wg.Wait()
goprogressor.Stop()
$ go get -v gitee.com/shirdonl/goProgressor
goprogressor распространяется под лицензией MIT. Смотрите LICENSE.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )