1

以下は動作しません。スレッド内で resources.next_document を呼び出すと、nil が返されます。スレッドを使用しない同じ呼び出しは、期待どおりに機能します。

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  
4

2 に答える 2

1

これは私が最終的に使用したソリューションです:

フィードバック歓迎

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
于 2010-02-24T12:29:08.090 に答える
1

ドライバー自体はスレッドセーフですが、個々のカーソルはそうではないため、説明している方法でデータを確実に処理することはできません。

可能性の 1 つは、ドキュメントを反復処理する単一のスレッドを作成し、ドキュメントを実際の処理のために任意の数のワーカー スレッドに渡すことです。

于 2010-02-23T15:42:58.583 に答える