Как использовать многопоточность в рельсах 3?
Я отправляю почту пользователям с помощью actionmailer через почтовый штемпель. Это мой код в контроллере:
@users = User.where(some condition)
@product = Product.find_by_name(some name).first
for user in @users
UserMailer.new_product_arrival(user, @product, home_url).deliver
end
и это мой user_mailer.rb
def new_product_arrival(user,product,home_url)
@from = Settings.mailer_from_address
@recipients = user.login
@sent_on = Time.now
@user = user
@product = product
@content_type = "text/html"
@home_url = home_url
end
Проблема в том, что если пользователей более 10, это занимает очень много времени из-за цикла for
. Мне нужно знать, можем ли мы справиться с этим, используя многопоточную или фоновое задание. Я не хочу использовать фоновое задание, но может ли кто-нибудь сказать мне, как реализовать выше, используя многопоточность.
Я использую ruby 1.8.7 и rails 3.0.7
Ответы
Ответ 1
В основном два способа обернуть ваш цикл, чтобы получить "многопоточность":
-
Разверните поток для каждой доставки и присоедините их к основному потоку
threads = []
for user in @users
threads << Thread.new do
UserMailer.new_product_arrival(user, @product, home_url).deliver
end
end
threads.each(&:join)
-
для всего приложения rails (довольно грязно, но приложение rails, обслуживающее запрос, будет отвечать немедленно) и отключить процесс:
process = fork do
for user in @users
UserMailer.new_product_arrival(user, @product, home_url).deliver
end
Process.kill("HUP")
#sends the kill signal to current Process, which is the Rails App sending your emails
end
Process.detach(process)
Надеюсь, что поможет
Ответ 2
наш разработчик Артем недавно сделал крупное обновление Postmark gem
который позволяет вам отправлять электронные письма легко в партиях, что должно позволить вам быстрее отправлять электронные письма. Проверьте это.
Ответ 3
Попробуйте delayed_job gem. Это база данных, основанная на базе данных. Мы использовали его на веб-сайте электронной коммерции, например, отправляя письма с подтверждением заказа пользователям.
Эти задачи могут происходить асинхронно в фоновом режиме, потому что ваше приложение Rails не нуждается
они выполняются немедленно.
Ответ 4
um im a rails student from nairobi dev school kenya.. и я думаю, что вы можете дать это попробовать,.. soo, что у вас есть, есть отложенный ответ из-за количества пользователей.. вы можете попробовать длительный опрос пример
poll = function (){
s.ajax{
url:/'chat.json'
data: { last_time: get last_time () }
}}.done(function(data) {
// handle data
setTimeout(poll,1000);
});
}
попробуйте сделать это по-своему. Это полезно для приложения в реальном времени... вы можете использовать даже контроллер действий: live..и думаю, что вы знакомы с потоками с рельсами. Кроме того, вышеприведенные примеры помогут вам, hopefuly
\