Class: Hydra::Worker

Inherits:
Object
  • Object
show all
Includes:
Messages::Worker
Defined in:
lib/hydra/worker.rb

Overview

Hydra class responsible to dispatching runners and communicating with the master.

The Worker is never run directly by a user. Workers are created by a Master to delegate to Runners.

The general convention is to have one Worker per machine on a distributed network.

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Worker

Create a new worker.

  • io: The IO object to use to communicate with the master

  • num_runners: The number of runners to launch



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/hydra/worker.rb', line 15

def initialize(opts = {})
  @verbose = opts.fetch(:verbose) { false }
  @io = opts.fetch(:io) { raise "No IO Object" }
  @runners = []
  @listeners = []

  boot_runners(opts.fetch(:runners) { 1 })
  process_messages
  
  @runners.each{|r| Process.wait r[:pid] }
end

Instance Method Details

#delegate_file(message) ⇒ Object

When the master sends a file down to the worker, it hits this method. Then the worker delegates the file down to a runner.



39
40
41
42
43
# File 'lib/hydra/worker.rb', line 39

def delegate_file(message)
  runner = idle_runner
  runner[:idle] = false
  runner[:io].write(RunFile.new(eval(message.serialize)))
end

#relay_results(message, runner) ⇒ Object

When a runner finishes, it sends the results up to the worker. Then the worker sends the results up to the master.



47
48
49
50
# File 'lib/hydra/worker.rb', line 47

def relay_results(message, runner)
  runner[:idle] = true
  @io.write(Results.new(eval(message.serialize)))
end

#request_file(message, runner) ⇒ Object

When a runner wants a file, it hits this method with a message. Then the worker bubbles the file request up to the master.



32
33
34
35
# File 'lib/hydra/worker.rb', line 32

def request_file(message, runner)
  @io.write(RequestFile.new)
  runner[:idle] = true
end

#shutdownObject

When a master issues a shutdown order, it hits this method, which causes the worker to send shutdown messages to its runners.



54
55
56
57
58
59
60
61
62
63
# File 'lib/hydra/worker.rb', line 54

def shutdown
  @running = false
  trace "Notifying #{@runners.size} Runners of Shutdown"
  @runners.each do |r|
    trace "Sending Shutdown to Runner"
    trace "\t#{r.inspect}"
    r[:io].write(Shutdown.new)
  end
  Thread.exit
end