我正在使用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_mail .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
基本上有两种方式来包装你的循环,以获得"多线程":
-
为每次交付创建一个线程并将它们连接回主线程
threads = [] for user in @users threads << Thread.new do UserMailer.new_product_arrival(user, @product, home_url).deliver end end threads.each(&:join)
-
fork整个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)
希望有帮助
我们的开发人员Artem最近对邮戳宝石进行了重大更新
,它允许您轻松地批量发送电子邮件,这应该允许您发送电子邮件更快。
尝试delayed_job gem。这是一个基于数据库的后台工作宝石。我们在一个电子商务网站中使用了它,例如,向用户发送订单确认邮件。
这些任务可以在后台异步发生,因为Rails应用程序不需要
我是一名来自肯尼亚内罗毕开发学校的rails学生。我觉得你可以试一试…所以你在那里遇到的是由于用户数量导致的延迟响应…您可以尝试长轮询一个示例
poll = function (){
s.ajax{
url:/'chat.json'
data: { last_time: get last_time () }
}}.done(function(data) {
// handle data
setTimeout(poll,1000);
});
}
用你自己的方法试试吧。这对于实时应用程序很有用,所以你甚至可以使用action controller:: live。我想你对rails的线程很熟悉,上面的例子也会对你有所帮助div