Imagine you want to restart several processes, either on one or on different servers, but that flingin flangin Capistrano just doesn't want to run all the restart tasks in parallel.
I know what you're saying, Capistrano already has a command called parallel
.
That should do right? Not exactly, we wanted to be able to run complete tasks,
no arbitrary blocks in parallel. The command parallel
is only able to run
specific shell commands, and it looks weird when you want to run several of
them on only one host.
We were inspired by the syntax though, so when you want to run arbitrary blocks in your Capistrano tasks, you can do it like this:
parallelize do |session|
session.run {deploy.restart}
session.run {queue.restart}
session.run {daemon.restart}
end
Every task will be run in its own thread, opening a new connection to the server. Because of this you should be aware of potential resource exhaustion. You can limit the number of threads in two ways, either set a variable (it defaults to 10):
set :parallelize_thread_count, 10
Or specify it with a parameter:
parallelize(5) do
...
end
If one of your tasks ran in a transaction block and issued a rollback, parallelize will rollback all other threads, if they have rollback statements defined.
Due to the threading you have to be sure to already have authenticated your SSH key (you're using SSH keys, right?) using an SSH agent before you run the parallelized code. Otherwise it'll blow up, let's just leave it at that. That'll change in the future.
-
Install the gem
gem install -s http://gems.github.com mattmatt-cap-ext-parallelize
-
Add the following line to your Capfile
require 'cap_ext_parallelize'
-
There is no step 3
(c) 2009 Mathias Meyer, Jonathan Weiss
MIT-License