[ANN] slave-0.2.0

A

ara.t.howard

SYNOPSIS

the Slave class forks a process and starts a drb server in the child using
any object as the server. the process is detached so it is not required
(nor possible) to wait on the child pid. a Heartbeat is set up between the
parent and child processes so that the child will exit of the parent exits
for any reason - preventing orphaned slaves from running indefinitely. the
purpose of Slaves is to be able to easily set up a collection of objects
communicating via drb protocols instead of having to use IPC.

typical usage:

obj = AnyClass::new

slave = Slave::new obj

p slave.object # handle on drb object
p slave.uri # uri of the drb object
p slave.socket # unix domain socket path for drb object
p slave.psname # title shown in ps/top

other usage:

set the pulse_rate used for the Heartbeat

slave = Slave::new MyClass::new, 'pulse_rate' => 10

same

Slave::pulse_rate = 10
slave = Slave::new MyClass::new

same

ENV['SLAVE_PULSE_RATE'] = 10
slave = Slave::new MyClass::new

to avoid having a copy of the object in both the parent and child use the
block form

slave = Slave::new{ Server::new } # copy only in child!
server = slave.object

if both an object AND a block are passed the object is passed to the block
in the child process

slave = Slave::new(Server::new){|server| p 'in child!' }

slaves may be configured via the environment, the Slave class, or via the
ctor for object itself. attributes which may be configured include

* socket_creation_attempts
* pulse_rate
* psname
* debug

HISTORY

0.2.0:
incorporated joel vanderWerf's patch such that, if no object is passed the
block is used to create one ONLY in the child. this avoids having a copy
in both parent and child is that needs to be avoided due to, for instance,
resource consumption.


0.0.1:
- patch from Logan Capaldo adds block form to slave new, block is run in the
child

- added a few more samples/*

- added Slave#wait

- added status information to slaves

- added close-on-exec flag to pipes in parent process

0.0.0:
- initial version


enjoy.

-a
 
E

Ezra Zygmuntowicz

SYNOPSIS

the Slave class forks a process and starts a drb server in the
child using
any object as the server. the process is detached so it is not
required
(nor possible) to wait on the child pid. a Heartbeat is set up
between the
parent and child processes so that the child will exit of the
parent exits
for any reason - preventing orphaned slaves from running
indefinitely. the
purpose of Slaves is to be able to easily set up a collection of
objects
communicating via drb protocols instead of having to use IPC.

<snip>

-a


This is a great library Ara, I am writing a library that wraps up
the slave lib into another interface for controlling jobs with timers
and a few other things. So the master process holds a thread pool
with references to slave classes in it so that you can set a limit on
the number of running slaves. Using it to offload jobs from a rails
app to not hold up the http flow. I have a question though. What
would be the cleanest way to have a slave class signal that it is
finished working and needs to be kill'ed. I know there is the
shutdown method that you could call from the master process to
shutdown a slave. But is there something similar that can be called
from a slave process? Or should I just let the slave process exit!
and let the heartbeat cleanup after the dead slaves?

Thanks
-Ezra
 
A

ara.t.howard

This is a great library Ara, I am writing a library that wraps up the
slave lib into another interface for controlling jobs with timers and
a few other things. So the master process holds a thread pool with
references to slave classes in it so that you can set a limit on the
number of running slaves. Using it to offload jobs from a rails app to
not hold up the http flow. I have a question though. What would be the
cleanest way to have a slave class signal that it is finished working
and needs to be kill'ed. I know there is the shutdown method that you
could call from the master process to shutdown a slave. But is there
something similar that can be called from a slave process? Or should I
just let the slave process exit! and let the heartbeat cleanup after
the dead slaves?

hmmm. good question. i could add a feature where at_exit handlers could be
added, somthing like


s = Slave.new( :at_exit => lambda{}){ do_child_stuff }


would that be sufficient?

-a
 
E

Ezra Zygmuntowicz

hmmm. good question. i could add a feature where at_exit handlers
could be
added, somthing like


s = Slave.new( :at_exit => lambda{}){ do_child_stuff }


would that be sufficient?

-a


Ara-

Yeah that would work fine I think. So that would call the lambda
when the child process calls exit! ? Is there any way for a slave to
call back to the parent process? Or is there a way to get the drb uri
of the parent from the child?

Thanks for slave and all your other codeforpeople ;) I have learned
a lot by reading through your code and by googling "cat a.rb" ;)


Cheers-
-Ezra
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,120
Latest member
ShelaWalli
Top