2

タスク:Async方法でアイテムを削除する [宿題]

Rails アプリケーションで既に構成Active jobsしましたが、Rails プロジェクトでタスクをdelayed_jobs実行することについてまだ混乱しています。Async

例を見てみましょう。データベースから削除するアイテムがありますが、それを適切に行いたいと考えていAsyncます。また、ブログでperform_laterorperform_nowメソッドについて読んでいます。delayed_job正常に動作している私のコードは次のとおりです。

コントローラ クラス

 def destroy
   PostJob.perform_now(params[:id])
   respond_to do |format|
    format.xml  { head :ok }
    format.js { render 'posts.js.erb' }
  end
 end

ジョブクラス

class PostJob < ActiveJob::Base
 queue_as :default

 def perform(id)
  @post = Post.find(id)
  @post.destroy
 end
end

delayed_jobs の公式ドキュメントによるとhandle_asynchronously、メソッドの最後に追加して実行することができasyncます。この場合、どのように実装できますか?

私の質問:

  1. メソッドを見ていると、途中destroyで要素を削除していませんAsyncdestroyただし、メソッドに記述されているすべての手順はSynchronous. 私が間違っている?
  2. そうでない場合、非同期でdestroy削除するメソッドを実装するにはどうすればよいですか?post
  3. バックグラウンド タスクと cron ジョブは同じものですか?

編集 -1

A Fader Darkly から提案を受けた後、プロセスに対して完全に機能するものに変更perform_nowしましたが、テーブルからエントリを削除していません (ユーザーのときに機能するため、コードは問題ありません)。perform_laterAsyncperform_now

また、次のコマンドで手動でジョブを実行している場合、すべて正常に動作します:

rake jobs:work

新しいデータを取得delay_jobしたらすぐにタスクを実行する方法はありますか?queue

4

1 に答える 1

1

destroy メソッドを呼び出すように変更した場合:

PostJob.perform_later(params[:id])

非同期に発生する必要があります。そうでない場合は、さらにセットアップを行う必要があります。

ご質問について:

  1. はい、あなたは正しいですが、あなたの言うことはトートロジーです。そのメソッドのすべてが同期的ですperform_now。.. したがって、destroy は非同期の方法では削除されません。
  2. 上記を参照。
  3. Cron ジョブはオペレーティング システム レベルで機能し、特定の時間に定期的にスケジュールされます。たとえば、毎分、毎日、または毎週 (特定の日の特定の時刻に) cron ジョブを実行することができます。これらは、crontab と呼ばれるスケジュール ファイルから実行されます。

タスクを「バックグラウンド化」すると、端末セッションの IO を引き継ぐのを単に停止できます。そのため、プロセスがバックグラウンドで実行されている間も端末を使用し続けることができます。通常、これはアドホック ベースで行われるため、負荷の高い操作が完了するのを待ってから別のタスクを実行する必要はありません。

編集

質問の編集に基づいて、遅延ジョブデーモンを開始する必要があるようです。指示から:

注: Rails 4 の場合、script/delayed_job を bin/delayed_job に置き換えます。キューをローカルで実行する場合は、コマンドの「RAILS_ENV=production」部分を省略します。

ジョブの実行 script/delayed_job を使用して、ジョブの処理を開始するバックグラウンド プロセスを管理できます。

これを行うには、gem「デーモン」を Gemfile に追加し、rails generatedelayed_job を実行したことを確認します。

その後、次のことができます。

RAILS_ENV=本番スクリプト/delayed_job 開始 RAILS_ENV=本番スクリプト/delayed_job 停止

2 つのワーカーを別々のプロセスで実行します。

RAILS_ENV=本番スクリプト/delayed_job -n 2 開始 RAILS_ENV=本番スクリプト/delayed_job 停止

--queue または --queues オプションを設定して、特定のキューから動作するようにします。

RAILS_ENV=本番スクリプト/delayed_job --queue=追跡開始 RAILS_ENV=本番スクリプト/delayed_job --queues=メーラー、タスク開始

--pool オプションを使用して、ワーカー プールを指定します。このオプションを複数回使用して、異なるキューに対して異なる数のワーカーを開始できます。

次のコマンドは、追跡キューの 1 つのワーカーを開始します。

メーラーとタスク キュー用に 2 つのワーカー、および任意のジョブ用に 2 つのワーカー:

RAILS_ENV=本番スクリプト/delayed_job --pool=トラッキング --pool=mailers,tasks:2 --pool=*:2 start

利用可能なすべてのジョブを実行してから終了します

RAILS_ENV=本番スクリプト/delayed_job start --exit-on-complete

またはフォアグラウンドで実行する

RAILS_ENV=プロダクション スクリプト/delayed_job run --exit-on-complete

于 2015-06-30T11:53:38.347 に答える