14

我正在通过邮戳使用 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

for问题是如果有超过 10 个用户,由于循环需要很长时间。我需要知道我们是否可以通过使用多线程或后台作业来处理这个问题。我不想使用后台作业,但谁能告诉我如何使用多线程实现上述功能。

我正在使用 ruby​​ 1.8.7 和 rails 3.0.7

4

4 回答 4

20

基本上有两种方法可以包装你的循环以获得“多线程”:

  1. 为每次交付创建一个线程并将它们加入主线程

    threads = []
    for user in @users
       threads << Thread.new do
         UserMailer.new_product_arrival(user, @product, home_url).deliver
       end
    end
    threads.each(&:join)
    
  2. 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)
    

希望有帮助

于 2011-11-22T17:35:59.940 回答
1

我们的开发人员Artem最近对Postmark gem进行了重大更新

这使您可以轻松地批量发送电子邮件,这应该可以让您更快地发送电子邮件。一探究竟。

于 2013-05-28T10:13:20.703 回答
0

尝试延迟工作宝石。这是一个基于数据库的后台作业 gem。我们在电子商务网站中使用它,例如,向用户发送订单确认电子邮件。

这些任务可以在后台异步发生,因为您的 Rails 应用程序不需要立即执行它们。

于 2013-11-15T16:43:19.770 回答
-4

嗯,我是来自肯尼亚内罗毕开发学校的 Rails 学生..我认为您可以尝试一下,..soo 您所遇到的是由于用户数量而导致的延迟响应..您可以尝试长轮询示例

poll = function (){
  s.ajax{
       url:/'chat.json'
       data: { last_time: get last_time () }
     }}.done(function(data) {
     // handle data
     setTimeout(poll,1000);
     });
}

以您的方式尝试..这对于实时应用程序很有用..o您甚至可以使用动作控制器:: live..我认为您对使用rails进行线程很熟悉..也.上面的例子会帮助您,,希望\

于 2013-11-28T06:51:48.423 回答