Class Slave
In: lib/slave.rb
lib/slave-1.2.1.rb
Parent: Object

the Slave class encapsulates the work of setting up a drb server in another process running on localhost via unix domain sockets. the slave process is attached to it‘s parent via a LifeLine which is designed such that the slave cannot out-live it‘s parent and become a zombie, even if the parent dies and early death, such as by ‘kill -9’. the concept and purpose of the Slave class is to be able to setup any server object in another process so easily that using a multi-process, drb/ipc, based design is as easy, or easier, than a multi-threaded one. eg

  class Server
    def add_two n
      n + 2
    end
  end

  slave = Slave.new 'object' => Server.new
  server = slave.object

  p server.add_two(40) #=> 42

two other methods of providing server objects exist:

a) server = Server.new "this is called the parent" }

   Slave.new(:object=>server){|s| puts "#{ s.inspect } passed to block in child process"}

b) Slave.new{ Server.new "this is called only in the child" }

of the two ‘b’ is preferred.

Methods

default   default   default   default   description   detach   detach   fork   fork   gen_psname   gen_psname   getopts   getopts   getopts   getopts   new   new   object   object   shutdown   shutdown   shutdown?   shutdown?   trace   trace   version   version   wait   wait   wait2   wait2  

Classes and Modules

Class Slave::LifeLine
Class Slave::ThreadSafe
Class Slave::ThreadSafeHash

Constants

VERSION = '1.3.2'
DEFAULT_SOCKET_CREATION_ATTEMPTS = Integer(ENV['SLAVE_SOCKET_CREATION_ATTEMPTS'] || 42)   env config
DEFAULT_DEBUG = (ENV['SLAVE_DEBUG'] ? true : false)
DEFAULT_THREADSAFE = (ENV['SLAVE_THREADSAFE'] ? true : false)
VERSION = '1.2.1'
DEFAULT_SOCKET_CREATION_ATTEMPTS = Integer(ENV['SLAVE_SOCKET_CREATION_ATTEMPTS'] || 42)   env config
DEFAULT_DEBUG = (ENV['SLAVE_DEBUG'] ? true : false)
DEFAULT_THREADSAFE = (ENV['SLAVE_THREADSAFE'] ? true : false)

Attributes

at_exit  [R] 
at_exit  [R] 
debug  [R] 
debug  [RW]  if this is true and you are running from a terminal information is printed on STDERR
debug  [RW]  if this is true and you are running from a terminal information is printed on STDERR
debug  [R] 
dumped  [R] 
dumped  [R] 
obj  [R]  attrs
obj  [R]  attrs
object  [R] 
object  [R] 
pid  [R] 
pid  [R] 
ppid  [R] 
ppid  [R] 
psname  [R] 
psname  [R] 
socket  [R] 
socket  [R] 
socket_creation_attempts  [RW] 
socket_creation_attempts  [RW]  defineds how many attempts will be made to create a temporary unix domain socket
socket_creation_attempts  [R] 
socket_creation_attempts  [R] 
status  [R] 
status  [R] 
threadsafe  [RW]  if this is true all slave objects will be wrapped such that any call to the object is threadsafe. if you do not use this you must ensure that your objects are threadsafe yourself as this is required of any object acting as a drb server
threadsafe  [RW]  if this is true all slave objects will be wrapped such that any call to the object is threadsafe. if you do not use this you must ensure that your objects are threadsafe yourself as this is required of any object acting as a drb server
uri  [R] 
uri  [R] 

Public Class methods

just fork with out silly warnings

just fork with out silly warnings

sets up a child process serving any object as a DRb server running locally on unix domain sockets. the child process has a LifeLine established between it and the parent, making it impossible for the child to outlive the parent (become a zombie). the object to serve is specfied either directly using the ‘object’/:object keyword

  Slave.new :object => MyServer.new

or, preferably, using the block form

  Slave.new{ MyServer.new }

when the block form is used the object is contructed in the child process itself. this is quite advantageous if the child object consumes resources or opens file handles (db connections, etc). by contructing the object in the child any resources are consumed from the child‘s address space and things like open file handles will not be carried into subsequent child processes (via standard unix fork semantics). in the event that a block is specified but the object cannot be constructed and, instead, throws and Exception, that exception will be propogated to the parent process.

opts may contain the following keys, as either strings or symbols

  object : specify the slave object.  otherwise block value is used.
  socket_creation_attempts : specify how many attempts to create a unix domain socket will be made
  debug : turn on some logging to STDERR
  psname : specify the name that will appear in 'top' ($0)
  at_exit : specify a lambda to be called in the *parent* when the child dies
  dumped : specify that the slave object should *not* be DRbUndumped (default is DRbUndumped)
  threadsafe : wrap the slave object with ThreadSafe to implement gross thread safety

sets up a child process serving any object as a DRb server running locally on unix domain sockets. the child process has a LifeLine established between it and the parent, making it impossible for the child to outlive the parent (become a zombie). the object to serve is specfied either directly using the ‘object’/:object keyword

  Slave.new :object => MyServer.new

or, preferably, using the block form

  Slave.new{ MyServer.new }

when the block form is used the object is contructed in the child process itself. this is quite advantageous if the child object consumes resources or opens file handles (db connections, etc). by contructing the object in the child any resources are consumed from the child‘s address space and things like open file handles will not be carried into subsequent child processes (via standard unix fork semantics). in the event that a block is specified but the object cannot be constructed and, instead, throws and Exception, that exception will be propogated to the parent process.

opts may contain the following keys, as either strings or symbols

  object : specify the slave object.  otherwise block value is used.
  socket_creation_attempts : specify how many attempts to create a unix domain socket will be made
  debug : turn on some logging to STDERR
  psname : specify the name that will appear in 'top' ($0)
  at_exit : specify a lambda to be called in the *parent* when the child dies
  dumped : specify that the slave object should *not* be DRbUndumped (default is DRbUndumped)
  threadsafe : wrap the slave object with ThreadSafe to implement gross thread safety

a simple convenience method which returns an object from another process. the object returned is the result of the supplied block. eg

  object = Slave.object{ processor_intensive_object_built_in_child_process() }

eg.

the call can be made asynchronous via the ‘async’/:async keyword

  thread = Slave.object(:async=>true){ long_processor_intensive_object_built_in_child_process() }

  # go on about your coding business then, later

  object = thread.value

a simple convenience method which returns an object from another process. the object returned is the result of the supplied block. eg

  object = Slave.object{ processor_intensive_object_built_in_child_process() }

eg.

the call can be made asynchronous via the ‘async’/:async keyword

  thread = Slave.object(:async=>true){ long_processor_intensive_object_built_in_child_process() }

  # go on about your coding business then, later

  object = thread.value

Public Instance methods

starts a thread to collect the child status and sets up at_exit handler to prevent zombies. the at_exit handler is canceled if the thread is able to collect the status

starts a thread to collect the child status and sets up at_exit handler to prevent zombies. the at_exit handler is canceled if the thread is able to collect the status

generate a default name to appear in ps/top

generate a default name to appear in ps/top

cuts the lifeline and kills the child process - give the key ‘quiet’ to ignore errors shutting down, including having already shutdown

cuts the lifeline and kills the child process - give the key ‘quiet’ to ignore errors shutting down, including having already shutdown

debugging output - ENV[‘SLAVE_DEBUG’]=1 to enable

debugging output - ENV[‘SLAVE_DEBUG’]=1 to enable

wait for slave to finish. if the keyword ‘non_block’=>true is given a thread is returned to do the waiting in an async fashion. eg

  thread = slave.wait(:non_block=>true){|value| "background <#{ value }>"}

wait for slave to finish. if the keyword ‘non_block’=>true is given a thread is returned to do the waiting in an async fashion. eg

  thread = slave.wait(:non_block=>true){|value| "background <#{ value }>"}
wait2(opts = {})

Alias for wait

wait2(opts = {})

Alias for wait

[Validate]