在 Celluloid 中动态分配演员

Dynamically assigning actors in Celluloid

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

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

我有 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

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

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 是数据库查询。