Ruby, MongoDB: Как разделить курсор между потоками? - PullRequest
1 голос
/ 23 февраля 2010

следующее не работает. Вызов resources.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  

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Это решение, которое я использовал в итоге:

Обратная связь приветствуется

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
1 голос
/ 23 февраля 2010

Хотя сам драйвер является потокобезопасным, а курсор отдельных - нет, поэтому вы не можете надежно обрабатывать данные так, как вы описываете.

Одной из возможностей может быть создание одного потока, который перебирает документы и передает их любому количеству рабочих потоков для фактической обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...