class ThreadPool
def <<(args)
def <<(args) tap { @args << args } end
def each(&block)
def each(&block) queue = Queue.new threads(queue, &block).tap do @args.inject(queue, &:<<).close end.each(&:join) @args end
def in_groups(&block)
def in_groups(&block) queue = Queue.new threads(queue, &block).tap do @args.group_by.with_index do |args, index| index % @size end.values.inject(queue, &:<<).close end.each(&:join) @args end
def initialize(size = CORES)
def initialize(size = CORES) @args, @size = [], size end
def threads(queue, &block)
def threads(queue, &block) @size.times.map do Thread.new do while args = queue.pop block.call(*args) end end end end