piotrmurach / tty-spinner

A terminal spinner for tasks that have non-deterministic time frame.
https://ttytoolkit.org
MIT License
427 stars 28 forks source link

Example with Parallel Gem and Multiple Processes #42

Closed ankane closed 4 years ago

ankane commented 4 years ago

Hey Piotr, thanks for this great gem! I wanted to share a quick example of how to use the multi spinner with the parallel gem in case others run into this. If you use multiple processes, registering spinners inside the block will lead to messy output. Instead, register them with the start option and set the final state with the finish option.

Bad

require "parallel"
require "tty-spinner"

spinners = TTY::Spinner::Multi.new

Parallel.map([1, 2, 3]) do |n|
  spinner = spinners.register("[:spinner] Task #{n}")
  spinner.auto_spin
  sleep(n)
  spinner.success
  nil
end

Good

require "parallel"
require "tty-spinner"

spinners = TTY::Spinner::Multi.new
item_spinners = {}

start = lambda do |item, i|
  spinner = spinners.register("[:spinner] Task #{item}")
  spinner.auto_spin
  item_spinners[item] = spinner
end

finish = lambda do |item, i, result|
  item_spinners[item].success
end

Parallel.each([1, 2, 3], start: start, finish: finish) do |n|
  sleep(n)
end