Sha256: 1e7a554d188e25482e46865e66aa115cf0bd64f10773d3b68f51640d12fdb930

Contents?: true

Size: 1.46 KB

Versions: 1

Compression:

Stored size: 1.46 KB

Contents

# Multi-threading is necessary for taking advantage of multi cpu/core 
# * MRI does not take advantage of multi core so you will not see any gain
# * JRUBY does use native thread and thus will benefit of threading.
#
# I have personnaly gainned 15% of global ontomde execution time on a
# dual CPU with anti-virus using between 25% and 90% of one core. 
# Benefit should be more noticeable with a quad core.
#
# (may 2009)
#

module Enumerable 
  PLATFORM_IS_JAVA=!(RUBY_PLATFORM.index('java').nil?)
  THREAD_NUMBER= ENV['ONTOMDE_THREADS'].nil? ? (PLATFORM_IS_JAVA ? 4 : 1) : ENV['ONTOMDE_THREADS'].to_int
  def eachInThread(res,nbThread=THREAD_NUMBER,&proc)
	if(res.context[:mtkThread,false])
		puts "!! WARNING: recursive multi-thread request ignored" 
		nbThread=1
	end	
	if(nbThread<=1 || (size < (nbThread*2)) ) 
		each &proc
		return 
	end	

	t=Array.new
	(0..(nbThread-1)).each { |i|
		t[i]=Array.new
	}
	# split collection in nbThread collections
	i=0
	each { |elt|
		t[i].push(elt)
		i=(i+1)%nbThread
	}
	
	# run one thread for each sub-collection
	rt=Array.new
	(0..(nbThread-1)).each { |i|
		puts "!Starting thread #{i} for #{t[i].size} elements"
		rt.push(Thread.new(i,t[i],res.context) {  |ii,tas,ctx|
			Thread.current["@@context"]=ctx
			res.mtk_context(:mtkThread  => true) {
				tas.each &proc
			#puts "!thread #{ii} done."
			}})
		
	}

	puts "!waiting for unfinished parallel tasks"
	rt.each { |th|
		th.join
	}
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ontomde-core-2.0.5 lib/ontomde-core/threads.rb