Следующее не работает. Вызов к ресурсам next_document в потоке возвращает ноль. Тот же вызов, не распараллеливая работы как ожидалось.
Какие-либо эксперты MongoDB там?:P
resources = db[Resource::COLLECTION].find
number_of_threads.times do
threads << Thread.new do
while resource = resources.next_document
puts 'one more doc'
end
end
end
Это решение, которое я в итоге использовал:
Обратная связь приветствуется
pool = DocumentPool.new(db)
5.times do
Thread.new do
while doc = pool.next_document
#something cool
end
end
end
class DocumentPool
COLLECTION = 'some_collection'
def initialize(db)
@db = db
@first_doc = cursor.next_document
end
def collection
@db[COLLECTION]
end
def cursor
@cursor ||= collection.find
end
def shift
doc = nil
if @first_doc
doc = @first_doc
@first_doc = nil
else
doc = cursor.next_document
end
doc
end
def count
collection.count
end
end
Хотя сам драйвер является потокобезопасным, отдельные курсоры таковыми не являются, поэтому вы не можете надежно обрабатывать данные так, как вы описываете.
Одна из возможностей заключается в том, чтобы иметь один поток, который итерирует документы, передавая их любому количеству рабочих потоков для фактической обработки.