Прочитав все сообщения о параллелизме в 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
, а затем присоединиться к нити.
В действительности, таблицы будут отброшены параллельно или все еще один за другим?
Зачем вы хотите сбросить их параллельно =? Если бы вы могли объяснить причину этого, это было бы полезно? – Abdullah
@MuhammadAbdullah, чтобы сэкономить время. если я делаю это параллельно, это будет быстрее, чем если бы я делал это один за другим. (На самом деле, у меня есть 1K-таблицы, мне нужно предварительно обрабатывать каждую таблицу, добавлять записи независимо для каждой таблицы. Если я делаю это в строке, она будет медленной. Если я делаю это параллельно для каждой таблицы, это будет быстрее) – Tonja
Обычно Sidekiq или jRuby используются для параллельных задач. Подробнее о Ruby's GIL (особенно MRI GIL) – Ilya