Sha256: d371a8bda9115a46327991e572ce647614610dd4f12c3d548eeaca820fec69fb

Contents?: true

Size: 855 Bytes

Versions: 12

Compression:

Stored size: 855 Bytes

Contents

# frozen_string_literal: true

module Spandx
  module Core
    class ThreadPool
      def initialize(size: 1)
        @size = size
        @queue = Queue.new
        @pool = size.times.map { start_worker_thread(@queue) }
      end

      def run(*args, &job)
        @queue.enq([job, args])
      end

      def done?
        @queue.empty?
      end

      def shutdown
        @size.times do
          run { throw :exit }
        end

        @pool.map(&:join)
      end

      def self.open(**args)
        pool = new(**args)
        yield pool
      ensure
        pool.shutdown
      end

      private

      def start_worker_thread(queue)
        Thread.new(queue) do |q|
          catch(:exit) do
            loop do
              job, args = q.deq
              job.call(args)
            end
          end
        end
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
spandx-0.19.0 lib/spandx/core/thread_pool.rb
spandx-0.18.3 lib/spandx/core/thread_pool.rb
spandx-0.18.2 lib/spandx/core/thread_pool.rb
spandx-0.18.1 lib/spandx/core/thread_pool.rb
spandx-0.18.0 lib/spandx/core/thread_pool.rb
spandx-0.17.0 lib/spandx/core/thread_pool.rb
spandx-0.16.1 lib/spandx/core/thread_pool.rb
spandx-0.16.0 lib/spandx/core/thread_pool.rb
spandx-0.15.1 lib/spandx/core/thread_pool.rb
spandx-0.15.0 lib/spandx/core/thread_pool.rb
spandx-0.14.0 lib/spandx/core/thread_pool.rb
spandx-0.13.5 lib/spandx/core/thread_pool.rb