好的,问题更新后看起来更清楚了。你可以做这样的事情,使用method_missing
和instance_eval
线程:
class Parallelizer
class << self
def run(receiver, &block)
@receiver = receiver
instance_eval &block
# wait for all threads to finish
@threads.each{|t| t.join}
@results
end
def method_missing *args, &block
@threads ||= []
@results ||= []
@threads.push Thread.new{
# you could add here custom wrappings
@results.push(@receiver.send(*args, &block))
}
end
end
end
class Test
def take_a_break name, sec
puts "#{name} taking a break for #{sec} seconds"
Kernel.sleep sec
puts "#{name} done."
name
end
end
t = Test.new
results = Parallelizer.run(t) do
take_a_break 'foo', 3
take_a_break 'bar', 2
take_a_break 'baz', 1
end
不过要小心,这没有经过充分测试,我不确定线程安全性如何。