Ruby, MongoDB: Как совместно использовать Курсор между потоками?

Следующее не работает. Вызов к ресурсам 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  
1
задан Alexandre 23 February 2010 в 12:43
поделиться

2 ответа

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

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

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
ответ дан 3 September 2019 в 01:10
поделиться

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

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

1
ответ дан 3 September 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: