Я обрабатываю элементы с потоками и очередями, но иногда выдается исключение для определенного элемента, поэтому он не обрабатывается.
Моя идея состоит в том, чтобы поместить нарушающий элемент обратно в очередь, чтобы его можно было снова обработать, и продолжайте помещать его обратно до тех пор, пока исключение больше не будет выброшено.
Несмотря на мое намерение повторно обрабатывать элементы, этот код обрабатывает очередь только один раз:
#assume this queue is immediately filled with items
item_queue = Queue.new
define_method (:processItem) {|item|
begin
#do something with item
#Bad style below: will work in specific exception handling later
rescue Exception => ex
#something happened, so put it back in the queue
item_queue << item
return
end
#more processing here, if 'begin' was successful
}
threads = []
until item_queue.empty?
threads << Thread.new{ processItem(item_queue.pop) }
end
threads.each{|thread| thread.join}
Я думал, что Queue
поточно-ориентирован, поэтому его можно использовать вот так - но результаты показывают иначе.
Как я могу обеспечить повторную обработку всех элементов, создающих исключение, до тех пор, пока все элементы не будут успешными?