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

問題は、10人を超えるユーザーがいる場合、forループのために非常に長い時間がかかることです。マルチスレッドまたはバックグラウンドジョブを使用してこれを処理できるかどうかを知る必要があります。バックグラウンドジョブを使用したくありませんが、マルチスレッドを使用して上記を実装する方法を教えてもらえますか。

私はルビー1.8.7とレール3.0.7を使用しています

4

4 に答える 4

20

「マルチスレッド」を取得するためにループをラップするには、基本的に2つの方法があります。

  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. 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は最近、消印の宝石にメジャーアップデートを行いました

これにより、電子メールをバッチで簡単に送信できるようになり、電子メールをより速く送信できるようになります。見てみな。

于 2013-05-28T10:13:20.703 に答える
0

delayd_jobgemを試してください。これはデータベースベースのバックグラウンドジョブジェムです。たとえば、注文確認メールをユーザーに送信するなど、eコマースのWebサイトで使用しました。

Railsアプリではタスクをすぐに実行する必要がないため、これらのタスクはバックグラウンドで非同期に発生する可能性があります。

于 2013-11-15T16:43:19.770 に答える
-4

ナイロビ開発学校ケニアのレールの学生です。これを試してみることができると思います。ユーザー数が原因で応答が遅れる場合があります。長いポーリングの例を試すことができます。

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

自分のやり方で試してみてください..これはリアルタイムアプリケーションに役立ちます..oアクションコントローラも使用できます::ライブ..レールを使った糸脱毛であなたの農夫だと思います。 \

于 2013-11-28T06:51:48.423 に答える