-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqueue.rb
More file actions
46 lines (40 loc) · 872 Bytes
/
queue.rb
File metadata and controls
46 lines (40 loc) · 872 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
require 'ruby-progressbar'
class Queue
attr_accessor :threads, :size
attr_accessor :max, :skip_tick, :skip_elapsed, :pbar
def initialize(size = 5, *args)
@size = size
@threads = []
Hash[*args].each do |k,v|
send("#{k}=",v)
end
@mutex = Mutex.new
@pbar = ProgressBar.create(total: max, format: "%t %a (%c/%C) [%B] %e")
end
def enqueue(&block)
if threads.length >= size
Process.waitpid2(threads.slice!(0))
end
tick
threads << fork do
yield
end
end
def wait
threads.each do |cpid|
Process.waitpid2(cpid)
end
end
def self.run(*args)
stime = Time.now
queue = Queue.new(*args)
yield queue
queue.wait
elapsed = (Time.now - stime).to_f
puts "Time Elapsed (s): #{elapsed}" unless queue.skip_elapsed
end
protected
def tick
pbar.increment
end
end