Sha256: 561f4eb8d407428efc990fd10941bd8c59c5c41772622b8cbb5d5d7e5414bfcc

Contents?: true

Size: 1 KB

Versions: 1

Compression:

Stored size: 1 KB

Contents

module Enumerable
  
  def parallel
    ParallelEnumerable.new(self)
  end
  
end

class ParallelEnumerable
  
  def initialize(enumerable)
    @enumerable = enumerable
  end
  
  
  
  def each
    enumerable.map do |item|
      Thread.new do
        begin
          yield item
        rescue Exception # rescues StandardError by default; but we want to rescue and report all errors
          Houston.report_exception $!
        ensure
          ActiveRecord::Base.clear_active_connections!
        end
      end
    end.each(&:join)
  end
  
  def map
    queue = Queue.new
    
    each do |item|
      queue << yield(item)
    end
    
    [].tap do |results|
      results.push queue.pop until queue.empty?
    end
  end
  
  
  
  def method_missing(method_name, *args, &block)
    return super unless enumerable.respond_to?(method_name)
    
    $stderr.puts "[parallel-enumerable] ##{method_name} is not defined"
    enumerable.public_send(method_name, *args, &block)
  end
  
private
  
  attr_reader :enumerable
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
houston-core-0.5.0.beta1 lib/parallel_enumerable.rb