在 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 是数据库查询。
我正在学习如何使用 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 是数据库查询。