NAME

forkoff

SYNOPSIS

brain-dead simple parallel processing for ruby

URI

http://rubyforge.org/projects/codeforpeople

INSTALL

gem install forkoff

DESCRIPTION

forkoff works for any enumerable object, iterating a code block to run in a
child process and collecting the results.  forkoff can limit the number of
child processes which is, by default, 8.

SAMPLES

<========< samples/a.rb >========>

~ > cat samples/a.rb

  #
  # forkoff makes it trivial to do parallel processing with ruby, the following
  # prints out each word in a separate process
  #

    require 'forkoff'

    %w( hey you ).forkoff!{|word| puts "#{ word } from #{ Process.pid }"}

~ > ruby samples/a.rb

  hey from 3239
  you from 3240

<========< samples/b.rb >========>

~ > cat samples/b.rb

  #
  # for example, this takes only 1 second or so to complete
  #

    require 'forkoff'

    a = Time.now.to_f

    results =
      (0..7).forkoff do |i|

        sleep 1

        i ** 2

      end

    b = Time.now.to_f

    elapsed = b - a

    puts "elapsed: #{ elapsed }"
    puts "results: #{ results.inspect }"

~ > ruby samples/b.rb

  elapsed: 1.07044386863708
  results: [0, 1, 4, 9, 16, 25, 36, 49]

<========< samples/c.rb >========>

~ > cat samples/c.rb

  #
  # forkoff does *NOT* spawn processes in batches, waiting for each batch to
  # complete.  rather, it keeps a certain number of processes busy until all
  # results have been gathered.  in otherwords the following will ensure that 2
  # processes are running at all times, until the list is complete. note that
  # the following will take about 2 seconds to run (2 sets of 2 @ 1 second).
  #

  require 'forkoff'

  pid = Process.pid

  a = Time.now.to_f

  pstrees =
    %w( a b c d ).forkoff! :processes => 2 do |letter|
      sleep 1
      { letter => ` pstree -l 2 #{ pid } ` }
    end

  b = Time.now.to_f

  puts
  puts "pid: #{ pid }"
  puts "elapsed: #{ b - a }"
  puts

  require 'yaml'

  pstrees.each do |pstree|
    y pstree
  end

~ > ruby samples/c.rb

  pid: 3254
  elapsed: 2.12998485565186

  --- 
  a: |
    -+- 03254 ahoward ruby -Ilib samples/c.rb
     |-+- 03255 ahoward ruby -Ilib samples/c.rb
     \-+- 03256 ahoward ruby -Ilib samples/c.rb

  --- 
  b: |
    -+- 03254 ahoward ruby -Ilib samples/c.rb
     |-+- 03255 ahoward ruby -Ilib samples/c.rb
     \-+- 03256 ahoward ruby -Ilib samples/c.rb

  --- 
  c: |
    -+- 03254 ahoward ruby -Ilib samples/c.rb
     |-+- 03261 ahoward (ruby)
     \-+- 03262 ahoward ruby -Ilib samples/c.rb

  --- 
  d: |
    -+- 03254 ahoward ruby -Ilib samples/c.rb
     |-+- 03261 ahoward ruby -Ilib samples/c.rb
     \-+- 03262 ahoward ruby -Ilib samples/c.rb