【发布时间】:2017-05-20 05:01:42
【问题描述】:
在阅读了所有关于 Ruby 并行性的帖子后,我只是感到困惑,所以我将描述我想要做什么。
我有 names,其中包含大约 1000 个名称。
names
=> [{"name"=>"tickets"}, {"name"=>"events"}, {"name"=>"channel"}, {"name"=>"primes"}]
对于每个名称,如果它存在,我想使用 pg 删除一个表。
drop_str = "DROP TABLE IF EXISTS %s ;"
create_str = "CREATE TABLE %s (id SERIAL PRIMARY KEY,bkk varchar(255))"
names.each do |name|
conn.exec((drop_str % name["name"]) + (create_str % name["name"]))
end
但是,我不想一个接一个地丢表。我想并行进行。
我的想法是使用以下内容:
threads = []
drop_str = "DROP TABLE IF EXISTS %s ;"
create_str = "CREATE TABLE %s (id SERIAL PRIMARY KEY,bkk varchar(255))"
names.each do |name|
threads.push(Thread.new{conn.exec((drop_str % name["name"]) + (create_str % name["name"]))})
end
然后加入线程。
实际上这些表是并行删除还是一个接一个?
【问题讨论】:
-
为什么要并行删除它们=?如果您能解释其背后的原因会有所帮助吗?
-
@MuhammadAbdullah 以节省时间。如果我并行执行它会比我一个接一个地执行它更快。 (其实我有1K张表,需要对每张表进行预处理,为每张表独立添加记录。如果我连续做的话会慢一些。如果我对每张表并行做,会更快)
-
通常,Sidekiq 或 jRuby 用于并行任务。阅读更多关于 Ruby 的 GIL(尤其是 MRI GIL)
-
@Ilya gem Parallel 怎么样?
-
乍一看,它似乎也可以作为一种救援。但是,实际上,我没有尝试过。