Class: Workload::Gen
- Inherits:
-
Object
- Object
- Workload::Gen
- Defined in:
- lib/workload.rb
Constant Summary collapse
- DEFAULT_OPTS =
{ :sleep => 0.1 }.freeze
Instance Method Summary collapse
- #consume(n = 1, &block) ⇒ Object
- #display_errors ⇒ Object
-
#initialize(opts = {}, &block) ⇒ Gen
constructor
A new instance of Gen.
- #make_consumers ⇒ Object
- #make_producers ⇒ Object
- #produce(n = 1, &block) ⇒ Object
- #run! ⇒ Object
Constructor Details
#initialize(opts = {}, &block) ⇒ Gen
Returns a new instance of Gen.
9 10 11 12 13 14 15 |
# File 'lib/workload.rb', line 9 def initialize(opts = {}, &block) @opts = DEFAULT_OPTS.merge(opts) @queue = Queue.new @errors = [] block.call(self) end |
Instance Method Details
#consume(n = 1, &block) ⇒ Object
22 23 24 25 |
# File 'lib/workload.rb', line 22 def consume(n = 1, &block) @consumers_num = n @consume = block end |
#display_errors ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/workload.rb', line 54 def display_errors unless @errors.empty? puts "\nErrors:\n" @errors.each do |item, ex| puts "Item #{item} errored with: #{ex.message}" puts ex.backtrace.map {|e| " #{e}"}.join("\n") puts end exit 1 end end |
#make_consumers ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/workload.rb', line 35 def make_consumers @consumers_num.times.map do |i| Thread.new(i) do |j| Thread.current[:id] = j while @keep || !@queue.empty? begin item = @queue.pop(true) @consume.call(item) rescue ThreadError => ex sleep @opts[:sleep] rescue => ex print "ERROR: #{item} => #{ex}\n" @errors << [item, ex] end end end end end |
#make_producers ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/workload.rb', line 27 def make_producers @producers_num.times.map do |i| Thread.new do @produce.call(@queue) end end end |
#produce(n = 1, &block) ⇒ Object
17 18 19 20 |
# File 'lib/workload.rb', line 17 def produce(n = 1, &block) @producers_num = n @produce = block end |
#run! ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/workload.rb', line 67 def run! @keep = true @producers = make_producers @consumers = make_consumers @producers.each(&:join) @keep = false @consumers.each(&:join) display_errors end |