class Parapool

Constants

VERSION

Attributes

pool_size[R]

Public Class Methods

new(pool_size = 4) click to toggle source
# File lib/parapool.rb, line 11
def initialize(pool_size = 4)
  raise ArgumentError, 'Pool size must be greater than or equal to 1.' if pool_size < 1

  @pool_size = pool_size
  @queue = Queue.new
  @workers = []

  create_worker
end

Public Instance Methods

map(params, &block) click to toggle source
# File lib/parapool.rb, line 21
def map(params, &block)
  raise TypeError, "wrong argument type #{params.class} (expected Enumerable)" unless params.is_a?(Enumerable)
  raise Parapool::Error, 'must be called with a block' unless block_given?

  return if params.empty?

  sync = Synchronizer.new(params.size)

  jobs = []
  params.each do |param|
    job = Job.new(param, sync, &block)
    push(job)
    jobs << job
  end

  sync.wait

  jobs.map { |job| job.result }
end
release() click to toggle source
# File lib/parapool.rb, line 41
def release
  @workers.size.times.each do
    @queue.push(nil)
  end
  @workers.each do |worker|
    worker.join
  end
end

Private Instance Methods

create_worker() click to toggle source
# File lib/parapool.rb, line 52
def create_worker
  @pool_size.times do
    worker = Worker.new(@queue)
    worker.run
    @workers << worker
  end
end
push(job) click to toggle source
# File lib/parapool.rb, line 60
def push(job)
  raise TypeError, "wrong argument type #{job.class} (expected Parapool::Job)" unless job.is_a?(Job)

  @queue.push(job)

  self
end