Как использовать многопоточность в рельсах 3? - PullRequest
14 голосов
/ 22 ноября 2011

Я отправляю почту пользователям, используя 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

Ответы [ 4 ]

20 голосов
/ 22 ноября 2011

Существует два основных способа обернуть ваш цикл, чтобы получить «многопоточность»:

  1. Spwan поток для каждой доставки и присоединить его обратно к основному потоку

    threads = []
    for user in @users
       threads << Thread.new do
         UserMailer.new_product_arrival(user, @product, home_url).deliver
       end
    end
    threads.each(&:join)
    
  2. разветвляются на все приложение 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)
    

Надеюсь, это поможет

1 голос
/ 28 мая 2013

наш разработчик Артем недавно сделал серьезное обновление для Postmark gem

, что позволяет легко отправлять электронные письма в пакетном режиме, что должно позволить вам отправлять электронные письма быстрее. Проверьте это.

0 голосов
/ 28 ноября 2013

эм я студент рельсов из школы Найроби Дев Кения .. и я думаю, вы можете попробовать это, .. так что у вас есть задержка ответа из-за количества пользователей .. вы можете попробовать длительный опрос пример

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

попробуйте это по-своему .. это полезно для приложения реального времени .. или вы можете использовать даже контроллер действий :: live .. я думаю, что вы знакомы с потоками с рельсами. Также. Приведенные выше примеры помогут вам ,, hopefuly \

0 голосов
/ 15 ноября 2013

Попробуйте delayed_job драгоценный камень. Это фоновое задание на основе базы данных. Мы использовали его на веб-сайте электронной коммерции, например, отправляя пользователям электронные письма с подтверждением заказа.

Эти задачи могут выполняться асинхронно в фоновом режиме, потому что ваше Rails-приложение не нуждается в их казнили немедленно.

...