# Multiple workling instances

**URL:** <https://www.ruby-forum.com/t/multiple-workling-instances/163839>\
**Category:** Rails\
**Created:** [March 25, 2009, 11:37am UTC](https://www.ruby-forum.com/t/multiple-workling-instances/163839 "2009-03-25T11:37:17Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![rwhiten1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/3ec8ea/32.png) [@rwhiten1](https://www.ruby-forum.com/u/rwhiten1)\
**Post date:** [March 25, 2009, 11:37am UTC](https://www.ruby-forum.com/t/multiple-workling-instances/163839/1 "2009-03-25T11:37:17Z")

</div>

Hi,  
I’m running Starling and Workling to process background jobs. I’ve four  
instances of starling running on the same server, and I’m trying to get  
Workling to use them all. However, all of the jobs seem to be queued up  
and carried out one by one, instead of up to four being process  
simultaneously.

As a result, I’ve got a very long job queue which is taking a long time  
to process, and I’d like to reduce it.

I’ve set :multiple to true in script/workling\_client.rb, but this  
doesn’t seem to help.

I’m very inexperienced with both Starling and Workling, so it’s quite  
possible I’m either missing something simple, or approaching this the  
wrong way entirely…

Any suggestions or insight much appreciated!

best

---

<div class="post-metadata">

**Author:** ![rwhiten1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/3ec8ea/32.png) [@rwhiten1](https://www.ruby-forum.com/u/rwhiten1)\
**Post date:** [March 29, 2009, 9:52pm UTC](https://www.ruby-forum.com/t/multiple-workling-instances/163839/2 "2009-03-29T21:52:27Z")

</div>

I actually just was in the same situation. I also had thought  
multiple Starling instances would help things, but it didn’t. The  
bottleneck was Workling, and I imagine it is the same for you.  
Despite the lack of documentation, it turns out to be extremely easy  
to run several instances:

1. In script/workling\_client.rb, change :multiple from false to true  
as you already have, so the Daemon knows to allow for multiple  
instances
2. Just start more instances by calling “script/workling\_client start”  
several times. It will create workling0.pid, workling1.pid, etc. I’m  
not sure how to properly setup god.rb to monitor the multiple  
instances so if you do please let me know 🙂

FYI, you could also create multiple worker classes (my\_worker.rb,  
another\_worker.rb etc), and each Workling instance would use a thread  
for each class. So if you split up your methods into several classes,  
it might help things even more.

---

<div class="post-metadata">

**Author:** ![rwhiten1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/3ec8ea/32.png) [@rwhiten1](https://www.ruby-forum.com/u/rwhiten1)\
**Post date:** [March 29, 2009, 9:58pm UTC](https://www.ruby-forum.com/t/multiple-workling-instances/163839/3 "2009-03-29T21:58:20Z")

</div>

PS. Here is an extremely helpful series of blog posts for starling  
and workling:  
[http://davedupre.com/2008/03/25/ruby-background-tasks-with-starling/](http://davedupre.com/2008/03/25/ruby-background-tasks-with-starling/)

---

<div class="post-metadata">

**Author:** ![rwhiten1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/3ec8ea/32.png) [@rwhiten1](https://www.ruby-forum.com/u/rwhiten1)\
**Post date:** [April 11, 2009, 1:16am UTC](https://www.ruby-forum.com/t/multiple-workling-instances/163839/4 "2009-04-11T01:16:10Z")

</div>

I have modified my workling\_client script to better handle multiple  
worklings. This approach gives you full control over the workling  
process names and pid files, which you can then use to cleanly manage  
the worklings using God or Monit.

See below for my (admittedly hacky) solution:

#!/usr/bin/env ruby  
require ‘rubygems’  
require ‘daemons’

# This is a bit hacky, but we don’t have a clean way to hook into the

parsed

# options, as Daemons is managing these internally.

number = 0  
for i in 0…ARGV.length  
if ARGV[i] == ‘–number’  
number = ARGV[i + 1]  
2.times {ARGV.delete\_at(i)}  
end  
end

puts “Workling Number: #{number}”

workling = File.join(File.dirname( **FILE** ), ‘…’, ‘vendor’,  
‘plugins’, ‘workling’, ‘script’, ‘listen.rb’)  
options = {  
:app\_name =\> “workling-#{number}-client”,  
:ARGV =\> ARGV,  
:dir\_mode =\> :normal,  
:dir =\> File.join(File.dirname( **FILE** ), ‘…’, ‘log’),  
:log\_output =\> true,  
:multiple =\> false,  
:backtrace =\> true,  
:monitor =\> false  
}

Daemons.run(workling, options)
