CODESAMPLE

Master-Slave - Ruby

Share on:

The Master-Slave pattern distributes work to multiple worker nodes (slaves) from a central coordinator (master). The master assigns tasks, and slaves execute them independently, reporting results back to the master. This boosts performance through parallelization. This Ruby implementation uses threads for the slaves and a queue to manage tasks. The Master class enqueues tasks, and Slave threads dequeue and process them. The use of Queue provides thread-safe communication. This approach leverages Ruby’s concurrency features and is a common way to achieve parallelism in Ruby, fitting its flexible and expressive style.

require 'thread'

class Master
  def initialize(num_slaves)
    @num_slaves = num_slaves
    @task_queue = Queue.new
    @results = []
    @slaves = []
  end

  def enqueue_task(task)
    @task_queue << task
  end

  def start
    @num_slaves.times do
      @slaves << Thread.new do
        loop do
          task = @task_queue.pop
          break if task == :done # Signal to terminate
          result = task.call
          @results << result
        end
      end
    end
  end

  def stop
    @num_slaves.times { @task_queue << :done }
    @slaves.each(&:join)
  end

  def get_results
    @results
  end
end

# Example Task (can be any callable object)
def example_task(number)
  sleep(0.1) # Simulate work
  number * 2
end

# Usage
master = Master.new(4) # 4 slaves
master.start

(1..10).each do |i|
  master.enqueue_task(lambda { example_task(i) })
end

master.stop
results = master.get_results
puts "Results: #{results}"