# Slave-0.2.0

**URL:** <https://www.ruby-forum.com/t/slave-0-2-0/69769>\
**Category:** Ruby\
**Created:** [September 24, 2006, 12:56am UTC](https://www.ruby-forum.com/t/slave-0-2-0/69769 "2006-09-24T00:56:17Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [September 24, 2006, 12:56am UTC](https://www.ruby-forum.com/t/slave-0-2-0/69769/1 "2006-09-24T00:56:17Z")

</div>

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 C. 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

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [September 24, 2006, 6:28am UTC](https://www.ruby-forum.com/t/slave-0-2-0/69769/2 "2006-09-24T06:28:43Z")

</div>

On Sep 23, 2006, at 3:52 PM, removed\_email\_address@domain.invalid wrote:

> 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.
> 
> -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

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [September 24, 2006, 5:58pm UTC](https://www.ruby-forum.com/t/slave-0-2-0/69769/3 "2006-09-24T17:58:01Z")

</div>

On Sun, 24 Sep 2006, Ezra Z. wrote:

> 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

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [September 24, 2006, 11:40pm UTC](https://www.ruby-forum.com/t/slave-0-2-0/69769/4 "2006-09-24T23:40:42Z")

</div>

On Sep 24, 2006, at 8:57 AM, removed\_email\_address@domain.invalid wrote:

> > not hold up the http flow. I have a question though. What would
> 
> -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
