Как использовать многопоточность в рельсах 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 \