Ruby 如何并行运行某些作业

Ruby 如何并行运行某些作业,ruby,parallel-processing,Ruby,Parallel Processing,在阅读了所有关于Ruby中并行性的文章之后,我只是感到困惑,所以我将描述我想要做的事情 我有名称,其中包含大约1000个名称 names => [{"name"=>"tickets"}, {"name"=>"events"}, {"name"=>"channel"}, {"name"=>"primes"}] 对于每个名称,我想删除一个表,如果它使用pg存在的话 drop_str = "DROP TABLE IF EXISTS %s ;" create_str =

在阅读了所有关于Ruby中并行性的文章之后,我只是感到困惑,所以我将描述我想要做的事情

我有
名称
,其中包含大约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
然后加入线程


实际上,这些表是并行删除还是一个接一个地删除?

原则上,您可以并行运行多个SQL语句。大多数数据库引擎都是多线程的,可以并行执行多个语句,但有时这并没有多大意义,就像使用SQLite一样

不过,有几个警告可能会破坏您当前的代码

最重要的是,到数据库的单个连接总是附加了一些状态。通常,它会保存事务和数据库适配器的内部状态。因此,单个数据库连接通常一次只能在单个线程中使用。如果您试图在一个连接上发送多个并行语句,则很可能会出现决定性的中断

因此,当尝试使用线程并行运行多个语句时,每个线程都需要自己的数据库连接。在这里,使用线程池通常是有意义的,线程池创建固定数量的连接,并安排队列中的工作在这些线程池上运行


您可以使用Rails来处理数据库连接,并使用来自优秀gem的其中一个来调度语句。

为什么要并行删除它们=?如果你能解释一下这背后的原因会有帮助吗?@MuhammadAbdullah可以节省时间。如果我并行地做,它会比我一个接一个地做快。(事实上,我有1K个表,我需要预处理每个表,为每个表独立添加记录。如果我在一行中这样做,它会变慢。如果我为每个表并行执行,它会更快)通常,Sidekiq或jRuby用于并行任务。阅读更多关于Ruby的GIL(特别是MRI GIL)@Ilya关于宝石平行线呢?乍一看,它似乎也可能是一次拯救。但是,事实上,我没有尝试。ConnectionPool是ActiveRecord的一部分,这并不意味着必须使用Rails。没有理由仅仅为了这个就把Rails堆栈拉进去。ActiveRecord的一个很好的替代品是Sequel。