1

我正在学习如何使用Celluloid. 我已阅读所有文档,并认为我知道如何使用它但缺乏实践。我将使用包含近 12,000 行的 CSV 文件对其进行测试。 

我不确定我应该为一份工作分配多少演员。我猜这个数字应该是动态的。根据这个 railscasts 剧集,默认数字设置为您机器中的内核数,但您肯定应该根据您的工作负载更改此数字吗?

我有 12,000 条记录要通过,如果我执行下面的代码,我猜它会启动我池中的所有参与者并将它们排队处理工作。但是我应该如何衡量有多少演员要动态分配给作品呢?

我的理解还有很多漏洞,所以请随意挑战我的整个实现。

class Model < ActiveRecord::Base
  include Celluloid
  def initialize(row)
    self.name = row[0]
    self.alt_id = row[1]
    self.definition = row[2]
    self.save
    self.terminate
  end    
end

CSV.open("./files/my_file.csv", "wb") do |csv|
  Model.supervise(csv)
end
4

1 回答 1

2

首先,在您的情况下,您应该为您的演员创建​​一个不同的类。

class Model < ActiveRecord::Base
  def self.save_from_csv(row)
    new.tap do |m|
      m.name = row[0]
      m.alt_id = row[1]
      m.definition = row[2]
      m.save
    end
  end    
end

class CSVWorker
  include Celluloid

  def persist_from_csv(row)
    Model.persist_from_csv(row)
  end
end

然后您可以创建一个池并为每一行完成工作。

pool = CSVWorker.pool(size: 4)
CSV.foreach("./files/my_file.csv") do |row|
  pool.async.persist_from_csv(row)
end

注意async. 这就是它以伪并行运行的原因。

我承认我没有对此进行测试,但即使它 Works™,您也应该对其进行基准测试,看看是否真的从瘫痪中获得任何收益。我怀疑它在 MRI 中会快得多,因为唯一涉及的 IO 是数据库查询。

于 2015-05-06T22:12:38.983 回答