I made progress meters for parllel runners about a year ago in Julia using
Tk.jl. I've seen stopped using that bit of acode but here is what I have
unearthed from the depths:
#################### Progress Types ####################
type ProgressFrame
trace::Bool
widget::Tk_Widget
function ProgressFrame(title::String, trace::Bool)
if trace
print(title * "...\n\n")
new(true)
else
widget = Frame(Toplevel("Mamba Progress"))
pack(widget, expand=true, fill="both")
grid(Label(widget, title), 1, 2)
new(false, widget)
end
end
end
type Progress
frame::ProgressFrame
chain::Integer
iters::Integer
counter::Integer
t0::Float64
runin::Integer
threshold::Float64
pb::Tk_Widget
l1::Tk_Widget
l2::Tk_Widget
function Progress(f::ProgressFrame, chain::Integer, iters::Integer)
runin = max(1, min(10, iround(0.01 * iters)))
if f.trace
new(f, chain, iters, 0, time(), runin, 0.0)
else
pb = Progressbar(f.widget, orient="horizontal")
l1 = Label(f.widget, "Chain $chain: ")
l2 = Label(f.widget, @sprintf("[%s of %s remaining]", 0, 0))
grid(l1, chain+1, 1, sticky="news")
grid(pb, chain+1, 2, sticky="news")
grid(l2, chain+1, 3, sticky="news")
new(f, chain, iters, 0, time(), runin, time(), pb, l1, l2)
end
end
end
#################### Progress Methods ####################
function next!(p::Progress)
p.counter += 1
if p.frame.trace
if p.counter / p.iters >= p.threshold && p.counter >= p.runin
p.threshold += 0.10
print(STDOUT, p)
end
else
t = time()
if t > p.threshold + 1.0 || p.counter >= p.iters
p.threshold = t
myid() == 1 ? update!(p) : remotecall(1, update!, p)
sleep(0.01)
end
end
p
end
function reset!(p::Progress)
p.counter = 0
p.t0 = time()
p.threshold = p.frame.trace ? 0.0 : time()
p
end
function terminate!(f::ProgressFrame)
f.trace || tcl("destroy", parent(f.widget))
f
end
function update!(p::Progress)
elapsed = time() - p.t0
remaining = elapsed * (p.iters / p.counter - 1.0)
str = @sprintf("[%s of %s remaining]",
strfsec(remaining),
strfsec(elapsed + remaining))
set_value(p.pb, integer(100.0 * p.counter / p.iters))
set_value(p.l2, str)
p
end
function Base.print(io::IO, p::Progress)
elapsed = time() - p.t0
remaining = elapsed * (p.iters / p.counter - 1.0)
str = @sprintf("Chain %u: %3u%% [%s of %s remaining]",
p.chain,
100.0 * p.counter / p.iters,
strfsec(remaining),
strfsec(elapsed + remaining))
println(io, str)
end
function strfsec(sec::Real)
hr, sec = divrem(sec, 3600)
min, sec = divrem(sec, 60)
@sprintf "%u:%02u:%02u" hr min sec
end
On Sunday, November 15, 2015 at 9:35:24 AM UTC-6, Jason Eckstein wrote:
>
>
>
> I was playing around with the ProgressMeter.jl package by Tim Holy and it
> works great for a single threaded loop. I was wondering if there's any way
> to run several loops on multiple workers and have a set of progress bars
> update in real time. When I tried this with Tim's package it just said
> Progress: 100% Time: .... after each was complete but nothing during
> intermediate progress. What I had in mind was a display like
> Worker 1: Progress: X%...
> Worker 2: Progress: Y% ....
> that update in real time but have multiple lines to represent the
> different workers.
>