This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Running a Code Block on Many Objects Simultaneously | ||
|---|---|---|
| Code | Expected | Actual |
module Enumerable
def each_simultaneously
threads = []
each { |e| threads << Thread.new { yield e } }
return threads
end
end
start_time = Time.now
[7,8,9].each_simultaneously do |e|
sleep(5) # Simulate a long, high-latency operation
print "Completed operation for #{e}!\n"
end |
Completed operation for 8! Completed operation for 7! Completed operation for 9! |
|
Time.now - start_time |
5.009334 | 0.004593 |
require 'enumerator'
array = [7, 8, 9]
simultaneous_array = array.enum_for(:each_simultaneously)
simultaneous_array.each do |e|
sleep(5) # Simulate a long, high-latency operation
print "Completed operation for #{e}!\n"
end |
Completed operation for 7! Completed operation for 9! Completed operation for 8! |
|
simultaneous_array.collect { |x| sleep 5; x * -1 } |
[] | [] |
[SSHServer, HTTPServer, IRCServer].each_simultaneously do |server| server.serve_forever end |
More code goes here... |
Error! (Exception?) Here's stdout: NameError: uninitialized constant SSHServer from (irb):22 |
require 'enumerator'
module Enumerable
def all_simultaneously
if block_given?
collect { |e| Thread.new { yield(e) } }.each { |t| t.join }
self
else
enum_for :all_simultaneously
end
end
end
array.all_simultaneously.collect { |x| sleep 5; x * -1 } |
[-7, -9, -8] | [-8, -7, -9] |
array.all_simultaneously.each_with_index { |x, i| sleep 5; puts "#{i}=>#{x}" } |
0=>8 0=>7 0=>9 |
0=>8 0=>7 0=>9 |
module Enumerable
def collect
results = []
each_with_index { |e, i| results[i] = yield(e) }
results
end
def each_with_index
i = -1
each { |e| yield e, i += 1 }
end
end
array.all_simultaneously.collect { |x| sleep 5; x * -1 } |
[-7, -8, -9] | [-7, -8, -9] |
array.all_simultaneously.each_with_index { |x, i| sleep 5; puts "#{i}=>#{x}" } |
1=>8 0=>7 2=>9 |
1=>8 0=>7 2=>9 |