Hi,
In message "[ruby-talk:5245] Re: Running two iterators in parallel"
on 00/10/03, Yukihiro Matsumoto <matz / zetabits.com> writes:
||I have two iterators. I would like to run them in parallel, creating
||an iterator that generates arrays containing one element from each.
||Can anyone solve this puzzle?
|
|Use threads.
Oops. There is a termination condition bug.
Try this instead.
matz.
---
require 'thread'
def combine(*args)
queues = []
threads = []
for it in args
queue = SizedQueue.new(1)
th = Thread.start(it, queue) do |i,q|
self.send(it) do |x|
q.push x
end
end
queues.push queue
threads.push th
end
loop do
ary = []
for q in queues
ary.push q.pop
end
yield ary
for th in threads
return unless th.status
end
end
end
public :combine
def it1 ()
yield 1; yield 2; yield 3
end
def it2 ()
yield 4; yield 5; yield 6
end
combine('it1','it2') { |x|
# x is (1, 4), then (2, 5), then (3, 6)
}