class Multiki

Constants

VERSION

Public Class Methods

new(tasks, concurrency: 10) click to toggle source
# File lib/multiki.rb, line 3
def initialize(tasks, concurrency: 10)
  @concurrency = concurrency
  @queue = Queue.new

  self.<< tasks
end

Public Instance Methods

<<(tasks) click to toggle source
# File lib/multiki.rb, line 10
def <<(tasks)
  [*tasks].each do |task|
    @queue.push task
  end
end
each(&block) click to toggle source
# File lib/multiki.rb, line 16
def each(&block)
  run(&block)
end

Private Instance Methods

player() { |call| ... } click to toggle source
# File lib/multiki.rb, line 34
def player
  Thread.new do
    while !@queue.empty?
      begin
        task = @queue.pop
        yield task.call
      rescue StandardError => e
        puts "Unhandled error: #{e.inspect}"
      end
    end
  end
end
players(&block) click to toggle source
# File lib/multiki.rb, line 26
def players(&block)
  threads_number = [@concurrency || @queue.size].max

  threads_number.times.map do
    player(&block)
  end
end
run(&block) click to toggle source
# File lib/multiki.rb, line 22
def run(&block)
  players(&block).each(&:join)
end