NAME threadify.rb SYNOPSIS enumerable = %w( a b c d ) enumerable.threadify(2){ 'process this block using two worker threads' } enumerable.threadify(:each_slice, 4){ 'process each slice of 4 in a thread' } DESCRIPTION threadify.rb makes it stupid easy to process a bunch of data using 'n' worker threads INSTALL gem install threadify URI http://rubyforge.org/projects/codeforpeople http://github.com/ahoward/threadify/ SAMPLES <========< sample/a.rb >========> ~ > cat sample/a.rb require 'threadify' require 'open-uri' require 'yaml' uris = %w( http://codeforpeople.com http://drawohara.com http://twitter.com/drawohara http://github.com/ahoward/threadify/ http://google.com http://rubyforge.org http://ruby-lang.org http://hypem.com ) curl = lambda{|url| open(url){|socket| socket.read}} time 'without threadify' do uris.each{|uri| curl[uri]} end time 'with threadify' do uris.threadify(uris.size){|uri| curl[uri]} end BEGIN { def time label a = Time.now.to_f yield ensure b = Time.now.to_f y label => (b - a) end } ~ > ruby sample/a.rb --- without threadify: 8.49043202400208 --- with threadify: 2.45102596282959 <========< sample/b.rb >========> ~ > cat sample/b.rb require 'threadify' require 'yaml' #size = Integer(ARGV.shift || (2 ** 20)) size = 64 haystack = Array.new(size){|i| i} needle = 2 * (size / 3) a, b = 4, 2 time 'without threadify' do a = haystack.each do |value| break value if value == needle sleep(rand) # mimic work end end time 'with threadify' do b = haystack.threadify(:each_slice, size / 8) do |slice| slice.each{|value| threadify! value if value == needle} sleep(rand) # mimic work end end raise if a != b y :a => a, :b => b, :needle => needle BEGIN { def time label a = Time.now.to_f yield ensure b = Time.now.to_f y label => (b - a) end } ~ > ruby sample/b.rb --- without threadify: 19.2692859172821 --- with threadify: 0.851074934005737 --- :needle: 42 🅰️ 42 🅱️ 42 HISTORY 1.4.2 - fix name collision running under jruby's native threads. thanks charles nutter! 1.3.0 - added Threadify(*args, &block) method to execute arbitrary code in parallel Threadify(8){ puts Thread.current.object_id }.size #=> 8 1.1.0 - added ability to specify arbitrary iterator (not only each) [0,1,2,3].threadify(:each_slice, 2){|ary| ary} - update samples - auto include enumerator 0.0.3 - added ability to short-circuit the parallel processing, a.k.a to 'break' from threadify 0.0.2 - don't use thread.exit, just let the thread die naturally - add version to Threadify module - comments ;-)
Project
threadify
makes it stupid easy to process a bunch of data using n worker threads
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
Development
Primary Language
Ruby
Licenses
same as ruby's
Dependencies
Project Readme