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

尽管驱动程序本身是线程安全的,但个人游标不是,因此您无法以您描述的方式可靠地处理数据。

一种可能性是让一个线程遍历文档,将它们交给任意数量的工作线程进行实际处理。

于 2010-02-23T15:42:58.583 回答
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 回答