Class: Rake::RemoteTask::Action

Inherits:
Object
  • Object
show all
Defined in:
lib/remote_task.rb

Overview

Action is used to run a task’s remote_actions in parallel on each of its hosts. Actions are created automatically in Rake::RemoteTask#enhance.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(task, block) ⇒ Action

Creates a new Action that will run block for task.



605
606
607
608
609
# File 'lib/remote_task.rb', line 605

def initialize task, block
  @task  = task
  @block = block
  @workers = ThreadGroup.new
end

Instance Attribute Details

#blockObject (readonly)

The block this action will execute.



595
596
597
# File 'lib/remote_task.rb', line 595

def block
  @block
end

#taskObject (readonly)

The task this action is attached to.



590
591
592
# File 'lib/remote_task.rb', line 590

def task
  @task
end

#workersObject (readonly)

An Array of threads, one for each host this action executes on.



600
601
602
# File 'lib/remote_task.rb', line 600

def workers
  @workers
end

Instance Method Details

#==(other) ⇒ Object

:nodoc:



611
612
613
614
# File 'lib/remote_task.rb', line 611

def == other # :nodoc:
  return false unless Action === other
  block == other.block && task == other.task
end

#execute(hosts, task, args) ⇒ Object

Execute this action on hosts in parallel. Returns when block has completed for each host.



620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
# File 'lib/remote_task.rb', line 620

def execute hosts, task, args
  hosts.each do |host|
    t = task.clone
    t.target_host = host
    thread = Thread.new(t) do |task|
      Thread.current[:task] = task
      case block.arity
      when 1
        block.call task
      else
        block.call task, args
      end
      Thread.current[:task] = nil
    end
    @workers.add thread
  end
  @workers.list.each { |thr| thr.join }
end